From dbd110e2b7eb08c65218a5f9d09ef12fdc62c04a Mon Sep 17 00:00:00 2001 From: Stefan Radomski Date: Tue, 8 Jul 2014 02:20:56 +0200 Subject: First signs of Lua Datamodel --- CMakeLists.txt | 13 + config.h.in | 2 + contrib/src/LuaBridge/LuaBridge.h | 142 +++ contrib/src/LuaBridge/RefCountedObject.h | 363 ++++++ contrib/src/LuaBridge/RefCountedPtr.h | 251 +++++ contrib/src/LuaBridge/detail/CFunctions.h | 442 ++++++++ contrib/src/LuaBridge/detail/ClassInfo.h | 73 ++ contrib/src/LuaBridge/detail/Constructor.h | 204 ++++ contrib/src/LuaBridge/detail/FuncTraits.h | 852 +++++++++++++++ contrib/src/LuaBridge/detail/Iterator.h | 114 ++ contrib/src/LuaBridge/detail/LuaException.h | 113 ++ contrib/src/LuaBridge/detail/LuaHelpers.h | 143 +++ contrib/src/LuaBridge/detail/LuaRef.h | 1215 +++++++++++++++++++++ contrib/src/LuaBridge/detail/Namespace.h | 1136 +++++++++++++++++++ contrib/src/LuaBridge/detail/Stack.h | 469 ++++++++ contrib/src/LuaBridge/detail/TypeList.h | 174 +++ contrib/src/LuaBridge/detail/TypeTraits.h | 125 +++ contrib/src/LuaBridge/detail/Userdata.h | 817 ++++++++++++++ contrib/src/LuaBridge/detail/dump.h | 28 + embedding/csharp/uSCXMLEmbedding.suo | Bin 40448 -> 38912 bytes src/uscxml/Factory.cpp | 11 + src/uscxml/Interpreter.cpp | 4 +- src/uscxml/interpreter/InterpreterDraft6.cpp | 6 +- src/uscxml/plugins/datamodel/CMakeLists.txt | 24 + src/uscxml/plugins/datamodel/lua/LuaDataModel.cpp | 199 ++++ src/uscxml/plugins/datamodel/lua/LuaDataModel.h | 111 ++ test/uscxml/test-lua.scxml | 6 + test/w3c/lua/test144.scxml | 19 + test/w3c/lua/test147.scxml | 27 + test/w3c/lua/test148.scxml | 28 + test/w3c/lua/test149.scxml | 23 + test/w3c/lua/test150.scxml | 35 + test/w3c/lua/test151.scxml | 35 + test/w3c/lua/test152.scxml | 41 + test/w3c/lua/test153.scxml | 32 + test/w3c/lua/test155.scxml | 21 + test/w3c/lua/test156.scxml | 23 + test/w3c/lua/test158.scxml | 21 + test/w3c/lua/test159.scxml | 18 + test/w3c/lua/test172.scxml | 17 + test/w3c/lua/test173.scxml | 18 + test/w3c/lua/test174.scxml | 18 + test/w3c/lua/test175.scxml | 24 + test/w3c/lua/test176.scxml | 27 + test/w3c/lua/test178.scxml | 23 + test/w3c/lua/test179.scxml | 15 + test/w3c/lua/test183.scxml | 17 + test/w3c/lua/test185.scxml | 19 + test/w3c/lua/test186.scxml | 28 + test/w3c/lua/test187.scxml | 30 + test/w3c/lua/test189.scxml | 19 + test/w3c/lua/test190.scxml | 32 + test/w3c/lua/test191.scxml | 29 + test/w3c/lua/test192.scxml | 44 + test/w3c/lua/test193.scxml | 21 + test/w3c/lua/test194.scxml | 18 + test/w3c/lua/test198.scxml | 15 + test/w3c/lua/test199.scxml | 14 + test/w3c/lua/test200.scxml | 14 + test/w3c/lua/test201.scxml | 15 + test/w3c/lua/test205.scxml | 26 + test/w3c/lua/test207.scxml | 47 + test/w3c/lua/test208.scxml | 16 + test/w3c/lua/test210.scxml | 20 + test/w3c/lua/test215.scxml | 27 + test/w3c/lua/test216.scxml | 20 + test/w3c/lua/test216sub1.scxml | 5 + test/w3c/lua/test220.scxml | 21 + test/w3c/lua/test223.scxml | 27 + test/w3c/lua/test224.scxml | 28 + test/w3c/lua/test225.scxml | 34 + test/w3c/lua/test226.scxml | 18 + test/w3c/lua/test226sub1.scxml | 14 + test/w3c/lua/test228.scxml | 29 + test/w3c/lua/test229.scxml | 38 + test/w3c/lua/test230.scxml | 56 + test/w3c/lua/test232.scxml | 33 + test/w3c/lua/test233.scxml | 34 + test/w3c/lua/test234.scxml | 61 ++ test/w3c/lua/test235.scxml | 21 + test/w3c/lua/test236.scxml | 35 + test/w3c/lua/test237.scxml | 37 + test/w3c/lua/test239.scxml | 27 + test/w3c/lua/test239sub1.scxml | 5 + test/w3c/lua/test240.scxml | 63 ++ test/w3c/lua/test241.scxml | 88 ++ test/w3c/lua/test242.scxml | 48 + test/w3c/lua/test242sub1.scxml | 5 + test/w3c/lua/test243.scxml | 33 + test/w3c/lua/test244.scxml | 37 + test/w3c/lua/test245.scxml | 32 + test/w3c/lua/test247.scxml | 20 + test/w3c/lua/test250.scxml | 39 + test/w3c/lua/test252.scxml | 40 + test/w3c/lua/test253.scxml | 67 ++ test/w3c/lua/test276.scxml | 14 + test/w3c/lua/test276sub1.scxml | 16 + test/w3c/lua/test277.scxml | 24 + test/w3c/lua/test278.scxml | 15 + test/w3c/lua/test279.scxml | 16 + test/w3c/lua/test280.scxml | 25 + test/w3c/lua/test286.scxml | 15 + test/w3c/lua/test287.scxml | 16 + test/w3c/lua/test294.scxml | 38 + test/w3c/lua/test298.scxml | 24 + test/w3c/lua/test301.scxml | 11 + test/w3c/lua/test302.scxml | 13 + test/w3c/lua/test303.scxml | 18 + test/w3c/lua/test304.scxml | 11 + test/w3c/lua/test307.scxml | 35 + test/w3c/lua/test309.scxml | 10 + test/w3c/lua/test310.scxml | 13 + test/w3c/lua/test311.scxml | 14 + test/w3c/lua/test312.scxml | 17 + test/w3c/lua/test313.scxml | 18 + test/w3c/lua/test314.scxml | 27 + test/w3c/lua/test318.scxml | 24 + test/w3c/lua/test319.scxml | 17 + test/w3c/lua/test321.scxml | 13 + test/w3c/lua/test322.scxml | 26 + test/w3c/lua/test323.scxml | 13 + test/w3c/lua/test324.scxml | 17 + test/w3c/lua/test325.scxml | 15 + test/w3c/lua/test326.scxml | 29 + test/w3c/lua/test329.scxml | 46 + test/w3c/lua/test330.scxml | 20 + test/w3c/lua/test331.scxml | 51 + test/w3c/lua/test332.scxml | 26 + test/w3c/lua/test333.scxml | 13 + test/w3c/lua/test335.scxml | 13 + test/w3c/lua/test336.scxml | 23 + test/w3c/lua/test337.scxml | 13 + test/w3c/lua/test338.scxml | 35 + test/w3c/lua/test339.scxml | 13 + test/w3c/lua/test342.scxml | 23 + test/w3c/lua/test343.scxml | 27 + test/w3c/lua/test344.scxml | 20 + test/w3c/lua/test346.scxml | 46 + test/w3c/lua/test347.scxml | 36 + test/w3c/lua/test348.scxml | 13 + test/w3c/lua/test349.scxml | 25 + test/w3c/lua/test350.scxml | 20 + test/w3c/lua/test351.scxml | 39 + test/w3c/lua/test352.scxml | 24 + test/w3c/lua/test354.scxml | 44 + test/w3c/lua/test355.scxml | 12 + test/w3c/lua/test364.scxml | 71 ++ test/w3c/lua/test372.scxml | 25 + test/w3c/lua/test375.scxml | 20 + test/w3c/lua/test376.scxml | 20 + test/w3c/lua/test377.scxml | 23 + test/w3c/lua/test378.scxml | 23 + test/w3c/lua/test387.scxml | 85 ++ test/w3c/lua/test388.scxml | 66 ++ test/w3c/lua/test396.scxml | 13 + test/w3c/lua/test399.scxml | 57 + test/w3c/lua/test401.scxml | 17 + test/w3c/lua/test402.scxml | 34 + test/w3c/lua/test403a.scxml | 38 + test/w3c/lua/test403b.scxml | 32 + test/w3c/lua/test403c.scxml | 45 + test/w3c/lua/test404.scxml | 48 + test/w3c/lua/test405.scxml | 58 + test/w3c/lua/test406.scxml | 52 + test/w3c/lua/test407.scxml | 19 + test/w3c/lua/test409.scxml | 28 + test/w3c/lua/test411.scxml | 28 + test/w3c/lua/test412.scxml | 44 + test/w3c/lua/test413.scxml | 36 + test/w3c/lua/test415.scxml | 13 + test/w3c/lua/test416.scxml | 19 + test/w3c/lua/test417.scxml | 28 + test/w3c/lua/test419.scxml | 14 + test/w3c/lua/test421.scxml | 23 + test/w3c/lua/test422.scxml | 73 ++ test/w3c/lua/test423.scxml | 21 + test/w3c/lua/test436.scxml | 15 + test/w3c/lua/test444.scxml | 14 + test/w3c/lua/test445.scxml | 13 + test/w3c/lua/test446.scxml | 19 + test/w3c/lua/test446.txt | 1 + test/w3c/lua/test448.scxml | 30 + test/w3c/lua/test449.scxml | 10 + test/w3c/lua/test451.scxml | 13 + test/w3c/lua/test452.scxml | 25 + test/w3c/lua/test453.scxml | 19 + test/w3c/lua/test456.scxml | 19 + test/w3c/lua/test457.scxml | 61 ++ test/w3c/lua/test459.scxml | 43 + test/w3c/lua/test460.scxml | 30 + test/w3c/lua/test463.scxml | 14 + test/w3c/lua/test464.scxml | 13 + test/w3c/lua/test465.scxml | 19 + test/w3c/lua/test466.scxml | 13 + test/w3c/lua/test467.scxml | 10 + test/w3c/lua/test468.scxml | 22 + test/w3c/lua/test469.scxml | 23 + test/w3c/lua/test470.scxml | 22 + test/w3c/lua/test473.scxml | 36 + test/w3c/lua/test474.scxml | 35 + test/w3c/lua/test475.scxml | 35 + test/w3c/lua/test476.scxml | 35 + test/w3c/lua/test477.scxml | 35 + test/w3c/lua/test478.scxml | 34 + test/w3c/lua/test479.scxml | 34 + test/w3c/lua/test480.scxml | 30 + test/w3c/lua/test481.scxml | 35 + test/w3c/lua/test482.scxml | 14 + test/w3c/lua/test483.scxml | 25 + test/w3c/lua/test487.scxml | 16 + test/w3c/lua/test488.scxml | 27 + test/w3c/lua/test495.scxml | 20 + test/w3c/lua/test496.scxml | 13 + test/w3c/lua/test500.scxml | 13 + test/w3c/lua/test501.scxml | 17 + test/w3c/lua/test503.scxml | 35 + test/w3c/lua/test504.scxml | 71 ++ test/w3c/lua/test505.scxml | 44 + test/w3c/lua/test506.scxml | 48 + test/w3c/lua/test509.scxml | 16 + test/w3c/lua/test510.scxml | 21 + test/w3c/lua/test513.txt | 16 + test/w3c/lua/test518.scxml | 17 + test/w3c/lua/test519.scxml | 17 + test/w3c/lua/test520.scxml | 19 + test/w3c/lua/test521.scxml | 19 + test/w3c/lua/test522.scxml | 19 + test/w3c/lua/test525.scxml | 22 + test/w3c/lua/test527.scxml | 20 + test/w3c/lua/test528.scxml | 25 + test/w3c/lua/test529.scxml | 20 + test/w3c/lua/test530.scxml | 26 + test/w3c/lua/test531.scxml | 18 + test/w3c/lua/test532.scxml | 18 + test/w3c/lua/test533.scxml | 59 + test/w3c/lua/test534.scxml | 16 + test/w3c/lua/test537.scxml | 14 + test/w3c/lua/test539.scxml | 24 + test/w3c/lua/test539.txt | 4 + test/w3c/lua/test540.scxml | 20 + test/w3c/lua/test540.txt | 3 + test/w3c/lua/test542.scxml | 32 + test/w3c/lua/test543.scxml | 16 + test/w3c/lua/test544.scxml | 15 + test/w3c/lua/test545.scxml | 19 + test/w3c/lua/test546.scxml | 15 + test/w3c/lua/test547.scxml | 31 + test/w3c/lua/test550.scxml | 15 + test/w3c/lua/test551.scxml | 15 + test/w3c/lua/test552.scxml | 14 + test/w3c/lua/test552.txt | 1 + test/w3c/lua/test553.scxml | 19 + test/w3c/lua/test554.scxml | 23 + test/w3c/lua/test555.scxml | 24 + test/w3c/lua/test557.scxml | 24 + test/w3c/lua/test557.txt | 4 + test/w3c/lua/test558.scxml | 22 + test/w3c/lua/test558.txt | 3 + test/w3c/lua/test560.scxml | 16 + test/w3c/lua/test561.scxml | 21 + test/w3c/lua/test562.scxml | 19 + test/w3c/lua/test567.scxml | 29 + test/w3c/lua/test568.scxml | 12 + test/w3c/lua/test569.scxml | 12 + test/w3c/lua/test570.scxml | 40 + test/w3c/lua/test576.scxml | 35 + test/w3c/lua/test577.scxml | 17 + test/w3c/lua/test578.scxml | 16 + test/w3c/lua/test579.scxml | 52 + test/w3c/lua/test580.scxml | 37 + 270 files changed, 13293 insertions(+), 5 deletions(-) create mode 100644 contrib/src/LuaBridge/LuaBridge.h create mode 100644 contrib/src/LuaBridge/RefCountedObject.h create mode 100644 contrib/src/LuaBridge/RefCountedPtr.h create mode 100644 contrib/src/LuaBridge/detail/CFunctions.h create mode 100644 contrib/src/LuaBridge/detail/ClassInfo.h create mode 100644 contrib/src/LuaBridge/detail/Constructor.h create mode 100644 contrib/src/LuaBridge/detail/FuncTraits.h create mode 100644 contrib/src/LuaBridge/detail/Iterator.h create mode 100644 contrib/src/LuaBridge/detail/LuaException.h create mode 100644 contrib/src/LuaBridge/detail/LuaHelpers.h create mode 100644 contrib/src/LuaBridge/detail/LuaRef.h create mode 100644 contrib/src/LuaBridge/detail/Namespace.h create mode 100644 contrib/src/LuaBridge/detail/Stack.h create mode 100644 contrib/src/LuaBridge/detail/TypeList.h create mode 100644 contrib/src/LuaBridge/detail/TypeTraits.h create mode 100644 contrib/src/LuaBridge/detail/Userdata.h create mode 100644 contrib/src/LuaBridge/detail/dump.h create mode 100644 src/uscxml/plugins/datamodel/lua/LuaDataModel.cpp create mode 100644 src/uscxml/plugins/datamodel/lua/LuaDataModel.h create mode 100644 test/uscxml/test-lua.scxml create mode 100644 test/w3c/lua/test144.scxml create mode 100644 test/w3c/lua/test147.scxml create mode 100644 test/w3c/lua/test148.scxml create mode 100644 test/w3c/lua/test149.scxml create mode 100644 test/w3c/lua/test150.scxml create mode 100644 test/w3c/lua/test151.scxml create mode 100644 test/w3c/lua/test152.scxml create mode 100644 test/w3c/lua/test153.scxml create mode 100644 test/w3c/lua/test155.scxml create mode 100644 test/w3c/lua/test156.scxml create mode 100644 test/w3c/lua/test158.scxml create mode 100644 test/w3c/lua/test159.scxml create mode 100644 test/w3c/lua/test172.scxml create mode 100644 test/w3c/lua/test173.scxml create mode 100644 test/w3c/lua/test174.scxml create mode 100644 test/w3c/lua/test175.scxml create mode 100644 test/w3c/lua/test176.scxml create mode 100644 test/w3c/lua/test178.scxml create mode 100644 test/w3c/lua/test179.scxml create mode 100644 test/w3c/lua/test183.scxml create mode 100644 test/w3c/lua/test185.scxml create mode 100644 test/w3c/lua/test186.scxml create mode 100644 test/w3c/lua/test187.scxml create mode 100644 test/w3c/lua/test189.scxml create mode 100644 test/w3c/lua/test190.scxml create mode 100644 test/w3c/lua/test191.scxml create mode 100644 test/w3c/lua/test192.scxml create mode 100644 test/w3c/lua/test193.scxml create mode 100644 test/w3c/lua/test194.scxml create mode 100644 test/w3c/lua/test198.scxml create mode 100644 test/w3c/lua/test199.scxml create mode 100644 test/w3c/lua/test200.scxml create mode 100644 test/w3c/lua/test201.scxml create mode 100644 test/w3c/lua/test205.scxml create mode 100644 test/w3c/lua/test207.scxml create mode 100644 test/w3c/lua/test208.scxml create mode 100644 test/w3c/lua/test210.scxml create mode 100644 test/w3c/lua/test215.scxml create mode 100644 test/w3c/lua/test216.scxml create mode 100644 test/w3c/lua/test216sub1.scxml create mode 100644 test/w3c/lua/test220.scxml create mode 100644 test/w3c/lua/test223.scxml create mode 100644 test/w3c/lua/test224.scxml create mode 100644 test/w3c/lua/test225.scxml create mode 100644 test/w3c/lua/test226.scxml create mode 100644 test/w3c/lua/test226sub1.scxml create mode 100644 test/w3c/lua/test228.scxml create mode 100644 test/w3c/lua/test229.scxml create mode 100644 test/w3c/lua/test230.scxml create mode 100644 test/w3c/lua/test232.scxml create mode 100644 test/w3c/lua/test233.scxml create mode 100644 test/w3c/lua/test234.scxml create mode 100644 test/w3c/lua/test235.scxml create mode 100644 test/w3c/lua/test236.scxml create mode 100644 test/w3c/lua/test237.scxml create mode 100644 test/w3c/lua/test239.scxml create mode 100644 test/w3c/lua/test239sub1.scxml create mode 100644 test/w3c/lua/test240.scxml create mode 100644 test/w3c/lua/test241.scxml create mode 100644 test/w3c/lua/test242.scxml create mode 100644 test/w3c/lua/test242sub1.scxml create mode 100644 test/w3c/lua/test243.scxml create mode 100644 test/w3c/lua/test244.scxml create mode 100644 test/w3c/lua/test245.scxml create mode 100644 test/w3c/lua/test247.scxml create mode 100644 test/w3c/lua/test250.scxml create mode 100644 test/w3c/lua/test252.scxml create mode 100644 test/w3c/lua/test253.scxml create mode 100644 test/w3c/lua/test276.scxml create mode 100644 test/w3c/lua/test276sub1.scxml create mode 100644 test/w3c/lua/test277.scxml create mode 100644 test/w3c/lua/test278.scxml create mode 100644 test/w3c/lua/test279.scxml create mode 100644 test/w3c/lua/test280.scxml create mode 100644 test/w3c/lua/test286.scxml create mode 100644 test/w3c/lua/test287.scxml create mode 100644 test/w3c/lua/test294.scxml create mode 100644 test/w3c/lua/test298.scxml create mode 100644 test/w3c/lua/test301.scxml create mode 100644 test/w3c/lua/test302.scxml create mode 100644 test/w3c/lua/test303.scxml create mode 100644 test/w3c/lua/test304.scxml create mode 100644 test/w3c/lua/test307.scxml create mode 100644 test/w3c/lua/test309.scxml create mode 100644 test/w3c/lua/test310.scxml create mode 100644 test/w3c/lua/test311.scxml create mode 100644 test/w3c/lua/test312.scxml create mode 100644 test/w3c/lua/test313.scxml create mode 100644 test/w3c/lua/test314.scxml create mode 100644 test/w3c/lua/test318.scxml create mode 100644 test/w3c/lua/test319.scxml create mode 100644 test/w3c/lua/test321.scxml create mode 100644 test/w3c/lua/test322.scxml create mode 100644 test/w3c/lua/test323.scxml create mode 100644 test/w3c/lua/test324.scxml create mode 100644 test/w3c/lua/test325.scxml create mode 100644 test/w3c/lua/test326.scxml create mode 100644 test/w3c/lua/test329.scxml create mode 100644 test/w3c/lua/test330.scxml create mode 100644 test/w3c/lua/test331.scxml create mode 100644 test/w3c/lua/test332.scxml create mode 100644 test/w3c/lua/test333.scxml create mode 100644 test/w3c/lua/test335.scxml create mode 100644 test/w3c/lua/test336.scxml create mode 100644 test/w3c/lua/test337.scxml create mode 100644 test/w3c/lua/test338.scxml create mode 100644 test/w3c/lua/test339.scxml create mode 100644 test/w3c/lua/test342.scxml create mode 100644 test/w3c/lua/test343.scxml create mode 100644 test/w3c/lua/test344.scxml create mode 100644 test/w3c/lua/test346.scxml create mode 100644 test/w3c/lua/test347.scxml create mode 100644 test/w3c/lua/test348.scxml create mode 100644 test/w3c/lua/test349.scxml create mode 100644 test/w3c/lua/test350.scxml create mode 100644 test/w3c/lua/test351.scxml create mode 100644 test/w3c/lua/test352.scxml create mode 100644 test/w3c/lua/test354.scxml create mode 100644 test/w3c/lua/test355.scxml create mode 100644 test/w3c/lua/test364.scxml create mode 100644 test/w3c/lua/test372.scxml create mode 100644 test/w3c/lua/test375.scxml create mode 100644 test/w3c/lua/test376.scxml create mode 100644 test/w3c/lua/test377.scxml create mode 100644 test/w3c/lua/test378.scxml create mode 100644 test/w3c/lua/test387.scxml create mode 100644 test/w3c/lua/test388.scxml create mode 100644 test/w3c/lua/test396.scxml create mode 100644 test/w3c/lua/test399.scxml create mode 100644 test/w3c/lua/test401.scxml create mode 100644 test/w3c/lua/test402.scxml create mode 100644 test/w3c/lua/test403a.scxml create mode 100644 test/w3c/lua/test403b.scxml create mode 100644 test/w3c/lua/test403c.scxml create mode 100644 test/w3c/lua/test404.scxml create mode 100644 test/w3c/lua/test405.scxml create mode 100644 test/w3c/lua/test406.scxml create mode 100644 test/w3c/lua/test407.scxml create mode 100644 test/w3c/lua/test409.scxml create mode 100644 test/w3c/lua/test411.scxml create mode 100644 test/w3c/lua/test412.scxml create mode 100644 test/w3c/lua/test413.scxml create mode 100644 test/w3c/lua/test415.scxml create mode 100644 test/w3c/lua/test416.scxml create mode 100644 test/w3c/lua/test417.scxml create mode 100644 test/w3c/lua/test419.scxml create mode 100644 test/w3c/lua/test421.scxml create mode 100644 test/w3c/lua/test422.scxml create mode 100644 test/w3c/lua/test423.scxml create mode 100644 test/w3c/lua/test436.scxml create mode 100644 test/w3c/lua/test444.scxml create mode 100644 test/w3c/lua/test445.scxml create mode 100644 test/w3c/lua/test446.scxml create mode 100644 test/w3c/lua/test446.txt create mode 100644 test/w3c/lua/test448.scxml create mode 100644 test/w3c/lua/test449.scxml create mode 100644 test/w3c/lua/test451.scxml create mode 100644 test/w3c/lua/test452.scxml create mode 100644 test/w3c/lua/test453.scxml create mode 100644 test/w3c/lua/test456.scxml create mode 100644 test/w3c/lua/test457.scxml create mode 100644 test/w3c/lua/test459.scxml create mode 100644 test/w3c/lua/test460.scxml create mode 100644 test/w3c/lua/test463.scxml create mode 100644 test/w3c/lua/test464.scxml create mode 100644 test/w3c/lua/test465.scxml create mode 100644 test/w3c/lua/test466.scxml create mode 100644 test/w3c/lua/test467.scxml create mode 100644 test/w3c/lua/test468.scxml create mode 100644 test/w3c/lua/test469.scxml create mode 100644 test/w3c/lua/test470.scxml create mode 100644 test/w3c/lua/test473.scxml create mode 100644 test/w3c/lua/test474.scxml create mode 100644 test/w3c/lua/test475.scxml create mode 100644 test/w3c/lua/test476.scxml create mode 100644 test/w3c/lua/test477.scxml create mode 100644 test/w3c/lua/test478.scxml create mode 100644 test/w3c/lua/test479.scxml create mode 100644 test/w3c/lua/test480.scxml create mode 100644 test/w3c/lua/test481.scxml create mode 100644 test/w3c/lua/test482.scxml create mode 100644 test/w3c/lua/test483.scxml create mode 100644 test/w3c/lua/test487.scxml create mode 100644 test/w3c/lua/test488.scxml create mode 100644 test/w3c/lua/test495.scxml create mode 100644 test/w3c/lua/test496.scxml create mode 100644 test/w3c/lua/test500.scxml create mode 100644 test/w3c/lua/test501.scxml create mode 100644 test/w3c/lua/test503.scxml create mode 100644 test/w3c/lua/test504.scxml create mode 100644 test/w3c/lua/test505.scxml create mode 100644 test/w3c/lua/test506.scxml create mode 100644 test/w3c/lua/test509.scxml create mode 100644 test/w3c/lua/test510.scxml create mode 100644 test/w3c/lua/test513.txt create mode 100644 test/w3c/lua/test518.scxml create mode 100644 test/w3c/lua/test519.scxml create mode 100644 test/w3c/lua/test520.scxml create mode 100644 test/w3c/lua/test521.scxml create mode 100644 test/w3c/lua/test522.scxml create mode 100644 test/w3c/lua/test525.scxml create mode 100644 test/w3c/lua/test527.scxml create mode 100644 test/w3c/lua/test528.scxml create mode 100644 test/w3c/lua/test529.scxml create mode 100644 test/w3c/lua/test530.scxml create mode 100644 test/w3c/lua/test531.scxml create mode 100644 test/w3c/lua/test532.scxml create mode 100644 test/w3c/lua/test533.scxml create mode 100644 test/w3c/lua/test534.scxml create mode 100644 test/w3c/lua/test537.scxml create mode 100644 test/w3c/lua/test539.scxml create mode 100644 test/w3c/lua/test539.txt create mode 100644 test/w3c/lua/test540.scxml create mode 100644 test/w3c/lua/test540.txt create mode 100644 test/w3c/lua/test542.scxml create mode 100644 test/w3c/lua/test543.scxml create mode 100644 test/w3c/lua/test544.scxml create mode 100644 test/w3c/lua/test545.scxml create mode 100644 test/w3c/lua/test546.scxml create mode 100644 test/w3c/lua/test547.scxml create mode 100644 test/w3c/lua/test550.scxml create mode 100644 test/w3c/lua/test551.scxml create mode 100644 test/w3c/lua/test552.scxml create mode 100644 test/w3c/lua/test552.txt create mode 100644 test/w3c/lua/test553.scxml create mode 100644 test/w3c/lua/test554.scxml create mode 100644 test/w3c/lua/test555.scxml create mode 100644 test/w3c/lua/test557.scxml create mode 100644 test/w3c/lua/test557.txt create mode 100644 test/w3c/lua/test558.scxml create mode 100644 test/w3c/lua/test558.txt create mode 100644 test/w3c/lua/test560.scxml create mode 100644 test/w3c/lua/test561.scxml create mode 100644 test/w3c/lua/test562.scxml create mode 100644 test/w3c/lua/test567.scxml create mode 100644 test/w3c/lua/test568.scxml create mode 100644 test/w3c/lua/test569.scxml create mode 100644 test/w3c/lua/test570.scxml create mode 100644 test/w3c/lua/test576.scxml create mode 100644 test/w3c/lua/test577.scxml create mode 100644 test/w3c/lua/test578.scxml create mode 100644 test/w3c/lua/test579.scxml create mode 100644 test/w3c/lua/test580.scxml diff --git a/CMakeLists.txt b/CMakeLists.txt index 9fae0c8..f016f98 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -315,6 +315,7 @@ OPTION(BUILD_DM_ECMA "Build with ECMAScript datamodel" ON) OPTION(BUILD_DM_XPATH "Build with XPath datamodel" ON) OPTION(BUILD_DM_PROLOG "Build with Prolog datamodel" ON) OPTION(BUILD_DM_PROMELA "Build with Promela datamodel" ON) +OPTION(BUILD_DM_LUA "Build with Lua datamodel" ON) # a dummy target to depend on the targets needed for tests, see: # http://stackoverflow.com/questions/733475/cmake-ctest-make-test-doesnt-build-tests @@ -686,6 +687,16 @@ else() endif() +set(CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES_SHARED}) +find_package(Lua) +if (LUA_FOUND) + include_directories (${LUA_INCLUDE_DIR}) + include_directories(${PROJECT_SOURCE_DIR}/contrib/src/LuaBridge) + list (APPEND USCXML_OPT_LIBS ${LUA_LIBRARIES}) +endif() +set(CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES_ORIG}) + + find_package(OpenSSL) if (OPENSSL_FOUND) set(OPENSSL_HAS_ELIPTIC_CURVES OFF) @@ -932,6 +943,8 @@ foreach( FILE ${USCXML_FILES} ) source_group("Datamodel\\Promela" FILES ${FILE}) elseif (${PATH} MATCHES ".*datamodel\\/xpath.*") source_group("Datamodel\\XPath" FILES ${FILE}) + elseif (${PATH} MATCHES ".*datamodel\\/lua.*") + source_group("Datamodel\\Lua" FILES ${FILE}) elseif (${PATH} MATCHES ".*datamodel\\/null.*") source_group("Datamodel\\NULL" FILES ${FILE}) diff --git a/config.h.in b/config.h.in index a6b8c74..814760e 100644 --- a/config.h.in +++ b/config.h.in @@ -51,6 +51,7 @@ #cmakedefine BUILD_DM_PROMELA #cmakedefine BUILD_DM_ECMA #cmakedefine BUILD_DM_XPATH +#cmakedefine BUILD_DM_LUA /** Optional libraries we found */ #cmakedefine UMUNDO_FOUND @@ -63,6 +64,7 @@ #cmakedefine LIBICAL_FOUND #cmakedefine SWI_FOUND #cmakedefine FFMPEG_FOUND +#cmakedefine LUA_FOUND #cmakedefine OPENSCENEGRAPH_FOUND #cmakedefine PROTOBUF_FOUND #cmakedefine CORELOCATION_FOUND diff --git a/contrib/src/LuaBridge/LuaBridge.h b/contrib/src/LuaBridge/LuaBridge.h new file mode 100644 index 0000000..1928e9a --- /dev/null +++ b/contrib/src/LuaBridge/LuaBridge.h @@ -0,0 +1,142 @@ +//------------------------------------------------------------------------------ +/* + https://github.com/vinniefalco/LuaBridge + + Copyright 2012, Vinnie Falco + Copyright 2007, Nathan Reed + + License: The MIT License (http://www.opensource.org/licenses/mit-license.php) + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ +//============================================================================== + +#ifndef LUABRIDGE_LUABRIDGE_HEADER +#define LUABRIDGE_LUABRIDGE_HEADER + +// All #include dependencies are listed here +// instead of in the individual header files. +// +#include +#include +#include +#include +#include + +#define LUABRIDGE_MAJOR_VERSION 2 +#define LUABRIDGE_MINOR_VERSION 0 +#define LUABRIDGE_VERSION 200 + +namespace luabridge +{ + +// Forward declaration +// +template +struct Stack; + +#include "detail/LuaHelpers.h" + +#include "detail/TypeTraits.h" +#include "detail/TypeList.h" +#include "detail/FuncTraits.h" +#include "detail/Constructor.h" +#include "detail/Stack.h" +#include "detail/ClassInfo.h" + +class LuaRef; + +#include "detail/LuaException.h" +#include "detail/LuaRef.h" +#include "detail/Iterator.h" + +//------------------------------------------------------------------------------ +/** + security options. +*/ +class Security +{ +public: + static bool hideMetatables () + { + return getSettings().hideMetatables; + } + + static void setHideMetatables (bool shouldHide) + { + getSettings().hideMetatables = shouldHide; + } + +private: + struct Settings + { + Settings () : hideMetatables (true) + { + } + + bool hideMetatables; + }; + + static Settings& getSettings () + { + static Settings settings; + return settings; + } +}; + +#include "detail/Userdata.h" +#include "detail/CFunctions.h" +#include "detail/Namespace.h" + +//------------------------------------------------------------------------------ +/** + Push an object onto the Lua stack. +*/ +template +inline void push (lua_State* L, T t) +{ + Stack ::push (L, t); +} + +//------------------------------------------------------------------------------ +/** + Set a global value in the lua_State. + + @note This works on any type specialized by `Stack`, including `LuaRef` and + its table proxies. +*/ +template +inline void setGlobal (lua_State* L, T t, char const* name) +{ + push (L, t); + lua_setglobal (L, name); +} + +//------------------------------------------------------------------------------ +/** + Change whether or not metatables are hidden (on by default). +*/ +inline void setHideMetatables (bool shouldHide) +{ + Security::setHideMetatables (shouldHide); +} + +} + +#endif diff --git a/contrib/src/LuaBridge/RefCountedObject.h b/contrib/src/LuaBridge/RefCountedObject.h new file mode 100644 index 0000000..807b460 --- /dev/null +++ b/contrib/src/LuaBridge/RefCountedObject.h @@ -0,0 +1,363 @@ +//============================================================================== +/* + https://github.com/vinniefalco/LuaBridge + + Copyright 2012, Vinnie Falco + Copyright 2004-11 by Raw Material Software Ltd. + + This is a derivative work used by permission from part of + JUCE, available at http://www.rawaterialsoftware.com + + License: The MIT License (http://www.opensource.org/licenses/mit-license.php) + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. + + This file incorporates work covered by the following copyright and + permission notice: + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-11 by Raw Material Software Ltd. +*/ +//============================================================================== + +#ifndef LUABRIDGE_REFCOUNTEDOBJECT_HEADER +#define LUABRIDGE_REFCOUNTEDOBJECT_HEADER + +//#define LUABRIDGE_COMPILER_SUPPORTS_MOVE_SEMANTICS 1 + +#include + +//============================================================================== +/** + Adds reference-counting to an object. + + To add reference-counting to a class, derive it from this class, and + use the RefCountedObjectPtr class to point to it. + + e.g. @code + class MyClass : public RefCountedObjectType + { + void foo(); + + // This is a neat way of declaring a typedef for a pointer class, + // rather than typing out the full templated name each time.. + typedef RefCountedObjectPtr Ptr; + }; + + MyClass::Ptr p = new MyClass(); + MyClass::Ptr p2 = p; + p = 0; + p2->foo(); + @endcode + + Once a new RefCountedObjectType has been assigned to a pointer, be + careful not to delete the object manually. +*/ +template +class RefCountedObjectType +{ +public: + //============================================================================== + /** Increments the object's reference count. + + This is done automatically by the smart pointer, but is public just + in case it's needed for nefarious purposes. + */ + inline void incReferenceCount() const + { + ++refCount; + } + + /** Decreases the object's reference count. + + If the count gets to zero, the object will be deleted. + */ + inline void decReferenceCount() const + { + assert (getReferenceCount() > 0); + + if (--refCount == 0) + delete this; + } + + /** Returns the object's current reference count. */ + inline int getReferenceCount() const + { + return static_cast (refCount); + } + +protected: + //============================================================================== + /** Creates the reference-counted object (with an initial ref count of zero). */ + RefCountedObjectType() : refCount () + { + } + + /** Destructor. */ + virtual ~RefCountedObjectType() + { + // it's dangerous to delete an object that's still referenced by something else! + assert (getReferenceCount() == 0); + } + +private: + //============================================================================== + CounterType mutable refCount; +}; + +//============================================================================== + +/** Non thread-safe reference counted object. + + This creates a RefCountedObjectType that uses a non-atomic integer + as the counter. +*/ +typedef RefCountedObjectType RefCountedObject; + +//============================================================================== +/** + A smart-pointer class which points to a reference-counted object. + + The template parameter specifies the class of the object you want to point + to - the easiest way to make a class reference-countable is to simply make + it inherit from RefCountedObjectType, but if you need to, you could roll + your own reference-countable class by implementing a pair of methods called + incReferenceCount() and decReferenceCount(). + + When using this class, you'll probably want to create a typedef to + abbreviate the full templated name - e.g. + + @code + + typedef RefCountedObjectPtr MyClassPtr; + + @endcode +*/ +template +class RefCountedObjectPtr +{ +public: + /** The class being referenced by this pointer. */ + typedef ReferenceCountedObjectClass ReferencedType; + + //============================================================================== + /** Creates a pointer to a null object. */ + inline RefCountedObjectPtr() : referencedObject (0) + { + } + + /** Creates a pointer to an object. + + This will increment the object's reference-count if it is non-null. + */ + inline RefCountedObjectPtr (ReferenceCountedObjectClass* const refCountedObject) + : referencedObject (refCountedObject) + { + if (refCountedObject != 0) + refCountedObject->incReferenceCount(); + } + + /** Copies another pointer. + This will increment the object's reference-count (if it is non-null). + */ + inline RefCountedObjectPtr (const RefCountedObjectPtr& other) + : referencedObject (other.referencedObject) + { + if (referencedObject != 0) + referencedObject->incReferenceCount(); + } + +#if LUABRIDGE_COMPILER_SUPPORTS_MOVE_SEMANTICS + /** Takes-over the object from another pointer. */ + inline RefCountedObjectPtr (RefCountedObjectPtr&& other) + : referencedObject (other.referencedObject) + { + other.referencedObject = 0; + } +#endif + + /** Copies another pointer. + This will increment the object's reference-count (if it is non-null). + */ + template + inline RefCountedObjectPtr (const RefCountedObjectPtr& other) + : referencedObject (static_cast (other.getObject())) + { + if (referencedObject != 0) + referencedObject->incReferenceCount(); + } + + /** Changes this pointer to point at a different object. + + The reference count of the old object is decremented, and it might be + deleted if it hits zero. The new object's count is incremented. + */ + RefCountedObjectPtr& operator= (const RefCountedObjectPtr& other) + { + return operator= (other.referencedObject); + } + + /** Changes this pointer to point at a different object. + + The reference count of the old object is decremented, and it might be + deleted if it hits zero. The new object's count is incremented. + */ + template + RefCountedObjectPtr& operator= (const RefCountedObjectPtr& other) + { + return operator= (static_cast (other.getObject())); + } + +#if LUABRIDGE_COMPILER_SUPPORTS_MOVE_SEMANTICS + /** Takes-over the object from another pointer. */ + RefCountedObjectPtr& operator= (RefCountedObjectPtr&& other) + { + std::swap (referencedObject, other.referencedObject); + return *this; + } +#endif + + /** Changes this pointer to point at a different object. + + The reference count of the old object is decremented, and it might be + deleted if it hits zero. The new object's count is incremented. + */ + RefCountedObjectPtr& operator= (ReferenceCountedObjectClass* const newObject) + { + if (referencedObject != newObject) + { + if (newObject != 0) + newObject->incReferenceCount(); + + ReferenceCountedObjectClass* const oldObject = referencedObject; + referencedObject = newObject; + + if (oldObject != 0) + oldObject->decReferenceCount(); + } + + return *this; + } + + /** Destructor. + + This will decrement the object's reference-count, and may delete it if it + gets to zero. + */ + inline ~RefCountedObjectPtr() + { + if (referencedObject != 0) + referencedObject->decReferenceCount(); + } + + /** Returns the object that this pointer references. + The pointer returned may be zero, of course. + */ + inline operator ReferenceCountedObjectClass*() const + { + return referencedObject; + } + + // the -> operator is called on the referenced object + inline ReferenceCountedObjectClass* operator->() const + { + return referencedObject; + } + + /** Returns the object that this pointer references. + The pointer returned may be zero, of course. + */ + inline ReferenceCountedObjectClass* getObject() const + { + return referencedObject; + } + +private: + //============================================================================== + ReferenceCountedObjectClass* referencedObject; +}; + +/** Compares two ReferenceCountedObjectPointers. */ +template +bool operator== (const RefCountedObjectPtr& object1, ReferenceCountedObjectClass* const object2) +{ + return object1.getObject() == object2; +} + +/** Compares two ReferenceCountedObjectPointers. */ +template +bool operator== (const RefCountedObjectPtr& object1, const RefCountedObjectPtr& object2) +{ + return object1.getObject() == object2.getObject(); +} + +/** Compares two ReferenceCountedObjectPointers. */ +template +bool operator== (ReferenceCountedObjectClass* object1, RefCountedObjectPtr& object2) +{ + return object1 == object2.getObject(); +} + +/** Compares two ReferenceCountedObjectPointers. */ +template +bool operator!= (const RefCountedObjectPtr& object1, const ReferenceCountedObjectClass* object2) +{ + return object1.getObject() != object2; +} + +/** Compares two ReferenceCountedObjectPointers. */ +template +bool operator!= (const RefCountedObjectPtr& object1, RefCountedObjectPtr& object2) +{ + return object1.getObject() != object2.getObject(); +} + +/** Compares two ReferenceCountedObjectPointers. */ +template +bool operator!= (ReferenceCountedObjectClass* object1, RefCountedObjectPtr& object2) +{ + return object1 != object2.getObject(); +} + +//============================================================================== + +namespace luabridge +{ + +// forward declaration +template +struct ContainerTraits; + +template +struct ContainerTraits > +{ + typedef T Type; + + static T* get (RefCountedObjectPtr const& c) + { + return c.getObject (); + } +}; + +} + +//============================================================================== + +#endif + diff --git a/contrib/src/LuaBridge/RefCountedPtr.h b/contrib/src/LuaBridge/RefCountedPtr.h new file mode 100644 index 0000000..7c27ca4 --- /dev/null +++ b/contrib/src/LuaBridge/RefCountedPtr.h @@ -0,0 +1,251 @@ +//============================================================================== +/* + https://github.com/vinniefalco/LuaBridge + + Copyright 2012, Vinnie Falco + Copyright 2007, Nathan Reed + + License: The MIT License (http://www.opensource.org/licenses/mit-license.php) + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ +//============================================================================== + +#ifndef LUABRIDGE_REFCOUNTEDPTR_HEADER +#define LUABRIDGE_REFCOUNTEDPTR_HEADER + +#ifdef _MSC_VER +# include +#else +# include +# include +#endif + +//============================================================================== +/** + Support for our RefCountedPtr. +*/ +struct RefCountedPtrBase +{ + // Declaration of container for the refcounts +#ifdef _MSC_VER + typedef stdext::hash_map RefCountsType; +#else + struct ptr_hash + { + size_t operator () (const void * const v) const + { + static __gnu_cxx::hash H; + return H(uintptr_t(v)); + } + }; + typedef __gnu_cxx::hash_map RefCountsType; +#endif + +protected: + inline RefCountsType& getRefCounts () + { + static RefCountsType refcounts; + return refcounts ; + } +}; + +//============================================================================== +/** + A reference counted smart pointer. + + The api is compatible with boost::RefCountedPtr and std::RefCountedPtr, in the + sense that it implements a strict subset of the functionality. + + This implementation uses a hash table to look up the reference count + associated with a particular pointer. + + @tparam T The class type. + + @todo Decompose RefCountedPtr using a policy. At a minimum, the underlying + reference count should be policy based (to support atomic operations) + and the delete behavior should be policy based (to support custom + disposal methods). + + @todo Provide an intrusive version of RefCountedPtr. +*/ +template +class RefCountedPtr : private RefCountedPtrBase +{ +public: + template + struct rebind + { + typedef RefCountedPtr other; + }; + + /** Construct as nullptr or from existing pointer to T. + + @param p The optional, existing pointer to assign from. + */ + RefCountedPtr (T* p = 0) : m_p (p) + { + ++getRefCounts () [m_p]; + } + + /** Construct from another RefCountedPtr. + + @param rhs The RefCountedPtr to assign from. + */ + RefCountedPtr (RefCountedPtr const& rhs) : m_p (rhs.get()) + { + ++getRefCounts () [m_p]; + } + + /** Construct from a RefCountedPtr of a different type. + + @invariant A pointer to U must be convertible to a pointer to T. + + @param rhs The RefCountedPtr to assign from. + @tparam U The other object type. + */ + template + RefCountedPtr (RefCountedPtr const& rhs) : m_p (static_cast (rhs.get())) + { + ++getRefCounts () [m_p]; + } + + /** Release the object. + + If there are no more references then the object is deleted. + */ + ~RefCountedPtr () + { + reset(); + } + + /** Assign from another RefCountedPtr. + + @param rhs The RefCountedPtr to assign from. + @return A reference to the RefCountedPtr. + */ + RefCountedPtr & operator= (RefCountedPtr const& rhs) + { + if (m_p != rhs.m_p) + { + reset (); + m_p = rhs.m_p; + ++getRefCounts () [m_p]; + } + return *this; + } + + /** Assign from another RefCountedPtr of a different type. + + @note A pointer to U must be convertible to a pointer to T. + + @tparam U The other object type. + @param rhs The other RefCountedPtr to assign from. + @return A reference to the RefCountedPtr. + */ + template + RefCountedPtr & operator= (RefCountedPtr const& rhs) + { + reset (); + m_p = static_cast (rhs.get()); + ++getRefCounts () [m_p]; + return *this; + } + + /** Retrieve the raw pointer. + + @return A pointer to the object. + */ + T* get () const + { + return m_p; + } + + /** Retrieve the raw pointer. + + @return A pointer to the object. + */ + T* operator* () const + { + return m_p; + } + + /** Retrieve the raw pointer. + + @return A pointer to the object. + */ + T* operator-> () const + { + return m_p; + } + + /** Determine the number of references. + + @note This is not thread-safe. + + @return The number of active references. + */ + long use_count () const + { + return getRefCounts () [m_p]; + } + + /** Release the pointer. + + The reference count is decremented. If the reference count reaches + zero, the object is deleted. + */ + void reset () + { + if (m_p != 0) + { + if (--getRefCounts () [m_p] <= 0) + delete m_p; + + m_p = 0; + } + } + +private: + T* m_p; +}; + +//============================================================================== + +namespace luabridge +{ + +// forward declaration +template +struct ContainerTraits; + +template +struct ContainerTraits > +{ + typedef T Type; + + static T* get (RefCountedPtr const& c) + { + return c.get (); + } +}; + +} + +#endif diff --git a/contrib/src/LuaBridge/detail/CFunctions.h b/contrib/src/LuaBridge/detail/CFunctions.h new file mode 100644 index 0000000..0497b6b --- /dev/null +++ b/contrib/src/LuaBridge/detail/CFunctions.h @@ -0,0 +1,442 @@ +//------------------------------------------------------------------------------ +/* + https://github.com/vinniefalco/LuaBridge + + Copyright 2012, Vinnie Falco + + License: The MIT License (http://www.opensource.org/licenses/mit-license.php) + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ +//============================================================================== + +// We use a structure so we can define everything in the header. +// +struct CFunc +{ + //---------------------------------------------------------------------------- + /** + __index metamethod for a namespace or class static members. + + This handles: + Retrieving functions and class static methods, stored in the metatable. + Reading global and class static data, stored in the __propget table. + Reading global and class properties, stored in the __propget table. + */ + static int indexMetaMethod (lua_State* L) + { + int result = 0; + lua_getmetatable (L, 1); // push metatable of arg1 + for (;;) + { + lua_pushvalue (L, 2); // push key arg2 + lua_rawget (L, -2); // lookup key in metatable + if (lua_isnil (L, -1)) // not found + { + lua_pop (L, 1); // discard nil + rawgetfield (L, -1, "__propget"); // lookup __propget in metatable + lua_pushvalue (L, 2); // push key arg2 + lua_rawget (L, -2); // lookup key in __propget + lua_remove (L, -2); // discard __propget + if (lua_iscfunction (L, -1)) + { + lua_remove (L, -2); // discard metatable + lua_pushvalue (L, 1); // push arg1 + lua_call (L, 1, 1); // call cfunction + result = 1; + break; + } + else + { + assert (lua_isnil (L, -1)); + lua_pop (L, 1); // discard nil and fall through + } + } + else + { + assert (lua_istable (L, -1) || lua_iscfunction (L, -1)); + lua_remove (L, -2); + result = 1; + break; + } + + rawgetfield (L, -1, "__parent"); + if (lua_istable (L, -1)) + { + // Remove metatable and repeat the search in __parent. + lua_remove (L, -2); + } + else + { + // Discard metatable and return nil. + assert (lua_isnil (L, -1)); + lua_remove (L, -2); + result = 1; + break; + } + } + + return result; + } + + //---------------------------------------------------------------------------- + /** + __newindex metamethod for a namespace or class static members. + + The __propset table stores proxy functions for assignment to: + Global and class static data. + Global and class properties. + */ + static int newindexMetaMethod (lua_State* L) + { + int result = 0; + lua_getmetatable (L, 1); // push metatable of arg1 + for (;;) + { + rawgetfield (L, -1, "__propset"); // lookup __propset in metatable + assert (lua_istable (L, -1)); + lua_pushvalue (L, 2); // push key arg2 + lua_rawget (L, -2); // lookup key in __propset + lua_remove (L, -2); // discard __propset + if (lua_iscfunction (L, -1)) // ensure value is a cfunction + { + lua_remove (L, -2); // discard metatable + lua_pushvalue (L, 3); // push new value arg3 + lua_call (L, 1, 0); // call cfunction + result = 0; + break; + } + else + { + assert (lua_isnil (L, -1)); + lua_pop (L, 1); + } + + rawgetfield (L, -1, "__parent"); + if (lua_istable (L, -1)) + { + // Remove metatable and repeat the search in __parent. + lua_remove (L, -2); + } + else + { + assert (lua_isnil (L, -1)); + lua_pop (L, 2); + result = luaL_error (L,"no writable variable '%s'", lua_tostring (L, 2)); + } + } + + return result; + } + + //---------------------------------------------------------------------------- + /** + lua_CFunction to report an error writing to a read-only value. + + The name of the variable is in the first upvalue. + */ + static int readOnlyError (lua_State* L) + { + std::string s; + + s = s + "'" + lua_tostring (L, lua_upvalueindex (1)) + "' is read-only"; + + return luaL_error (L, s.c_str ()); + } + + //---------------------------------------------------------------------------- + /** + lua_CFunction to get a variable. + + This is used for global variables or class static data members. + + The pointer to the data is in the first upvalue. + */ + template + static int getVariable (lua_State* L) + { + assert (lua_islightuserdata (L, lua_upvalueindex (1))); + T const* ptr = static_cast (lua_touserdata (L, lua_upvalueindex (1))); + assert (ptr != 0); + Stack ::push (L, *ptr); + return 1; + } + + //---------------------------------------------------------------------------- + /** + lua_CFunction to set a variable. + + This is used for global variables or class static data members. + + The pointer to the data is in the first upvalue. + */ + template + static int setVariable (lua_State* L) + { + assert (lua_islightuserdata (L, lua_upvalueindex (1))); + T* ptr = static_cast (lua_touserdata (L, lua_upvalueindex (1))); + assert (ptr != 0); + *ptr = Stack ::get (L, 1); + return 0; + } + + //---------------------------------------------------------------------------- + /** + lua_CFunction to call a function with a return value. + + This is used for global functions, global properties, class static methods, + and class static properties. + + The function pointer is in the first upvalue. + */ + template ::ReturnType> + struct Call + { + typedef typename FuncTraits ::Params Params; + static int f (lua_State* L) + { + assert (isfulluserdata (L, lua_upvalueindex (1))); + FnPtr const& fnptr = *static_cast (lua_touserdata (L, lua_upvalueindex (1))); + assert (fnptr != 0); + ArgList args (L); + Stack ::ReturnType>::push (L, FuncTraits ::call (fnptr, args)); + return 1; + } + }; + + //---------------------------------------------------------------------------- + /** + lua_CFunction to call a function with no return value. + + This is used for global functions, global properties, class static methods, + and class static properties. + + The function pointer is in the first upvalue. + */ + template + struct Call + { + typedef typename FuncTraits ::Params Params; + static int f (lua_State* L) + { + assert (isfulluserdata (L, lua_upvalueindex (1))); + FnPtr const& fnptr = *static_cast (lua_touserdata (L, lua_upvalueindex (1))); + assert (fnptr != 0); + ArgList args (L); + FuncTraits ::call (fnptr, args); + return 0; + } + }; + + //---------------------------------------------------------------------------- + /** + lua_CFunction to call a class member function with a return value. + + The member function pointer is in the first upvalue. + The class userdata object is at the top of the Lua stack. + */ + template ::ReturnType> + struct CallMember + { + typedef typename FuncTraits ::ClassType T; + typedef typename FuncTraits ::Params Params; + + static int f (lua_State* L) + { + assert (isfulluserdata (L, lua_upvalueindex (1))); + T* const t = Userdata::get (L, 1, false); + MemFnPtr const& fnptr = *static_cast (lua_touserdata (L, lua_upvalueindex (1))); + assert (fnptr != 0); + ArgList args (L); + Stack ::push (L, FuncTraits ::call (t, fnptr, args)); + return 1; + } + }; + + template ::ReturnType> + struct CallConstMember + { + typedef typename FuncTraits ::ClassType T; + typedef typename FuncTraits ::Params Params; + + static int f (lua_State* L) + { + assert (isfulluserdata (L, lua_upvalueindex (1))); + T const* const t = Userdata::get (L, 1, true); + MemFnPtr const& fnptr = *static_cast (lua_touserdata (L, lua_upvalueindex (1))); + assert (fnptr != 0); + ArgList args(L); + Stack ::push (L, FuncTraits ::call (t, fnptr, args)); + return 1; + } + }; + + //---------------------------------------------------------------------------- + /** + lua_CFunction to call a class member function with no return value. + + The member function pointer is in the first upvalue. + The class userdata object is at the top of the Lua stack. + */ + template + struct CallMember + { + typedef typename FuncTraits ::ClassType T; + typedef typename FuncTraits ::Params Params; + + static int f (lua_State* L) + { + assert (isfulluserdata (L, lua_upvalueindex (1))); + T* const t = Userdata::get (L, 1, false); + MemFnPtr const& fnptr = *static_cast (lua_touserdata (L, lua_upvalueindex (1))); + assert (fnptr != 0); + ArgList args (L); + FuncTraits ::call (t, fnptr, args); + return 0; + } + }; + + template + struct CallConstMember + { + typedef typename FuncTraits ::ClassType T; + typedef typename FuncTraits ::Params Params; + + static int f (lua_State* L) + { + assert (isfulluserdata (L, lua_upvalueindex (1))); + T const* const t = Userdata::get (L, 1, true); + MemFnPtr const& fnptr = *static_cast (lua_touserdata (L, lua_upvalueindex (1))); + assert (fnptr != 0); + ArgList args (L); + FuncTraits ::call (t, fnptr, args); + return 0; + } + }; + + //-------------------------------------------------------------------------- + /** + lua_CFunction to call a class member lua_CFunction. + + The member function pointer is in the first upvalue. + The class userdata object is at the top of the Lua stack. + */ + template + struct CallMemberCFunction + { + static int f (lua_State* L) + { + assert (isfulluserdata (L, lua_upvalueindex (1))); + typedef int (T::*MFP)(lua_State* L); + T* const t = Userdata::get (L, 1, false); + MFP const& fnptr = *static_cast (lua_touserdata (L, lua_upvalueindex (1))); + assert (fnptr != 0); + return (t->*fnptr) (L); + } + }; + + template + struct CallConstMemberCFunction + { + static int f (lua_State* L) + { + assert (isfulluserdata (L, lua_upvalueindex (1))); + typedef int (T::*MFP)(lua_State* L); + T const* const t = Userdata::get (L, 1, true); + MFP const& fnptr = *static_cast (lua_touserdata (L, lua_upvalueindex (1))); + assert (fnptr != 0); + return (t->*fnptr) (L); + } + }; + + //-------------------------------------------------------------------------- + + // SFINAE Helpers + + template + struct CallMemberFunctionHelper + { + static void add (lua_State* L, char const* name, MemFnPtr mf) + { + new (lua_newuserdata (L, sizeof (MemFnPtr))) MemFnPtr (mf); + lua_pushcclosure (L, &CallConstMember ::f, 1); + lua_pushvalue (L, -1); + rawsetfield (L, -5, name); // const table + rawsetfield (L, -3, name); // class table + } + }; + + template + struct CallMemberFunctionHelper + { + static void add (lua_State* L, char const* name, MemFnPtr mf) + { + new (lua_newuserdata (L, sizeof (MemFnPtr))) MemFnPtr (mf); + lua_pushcclosure (L, &CallMember ::f, 1); + rawsetfield (L, -3, name); // class table + } + }; + + //-------------------------------------------------------------------------- + /** + __gc metamethod for a class. + */ + template + static int gcMetaMethod (lua_State* L) + { + Userdata* const ud = Userdata::getExact (L, 1); + ud->~Userdata (); + return 0; + } + + //-------------------------------------------------------------------------- + /** + lua_CFunction to get a class data member. + + The pointer-to-member is in the first upvalue. + The class userdata object is at the top of the Lua stack. + */ + template + static int getProperty (lua_State* L) + { + C const* const c = Userdata::get (L, 1, true); + T C::** mp = static_cast (lua_touserdata (L, lua_upvalueindex (1))); + Stack ::push (L, c->**mp); + return 1; + } + + //-------------------------------------------------------------------------- + /** + lua_CFunction to set a class data member. + + The pointer-to-member is in the first upvalue. + The class userdata object is at the top of the Lua stack. + */ + template + static int setProperty (lua_State* L) + { + C* const c = Userdata::get (L, 1, false); + T C::** mp = static_cast (lua_touserdata (L, lua_upvalueindex (1))); + c->**mp = Stack ::get (L, 2); + return 0; + } +}; diff --git a/contrib/src/LuaBridge/detail/ClassInfo.h b/contrib/src/LuaBridge/detail/ClassInfo.h new file mode 100644 index 0000000..8d58069 --- /dev/null +++ b/contrib/src/LuaBridge/detail/ClassInfo.h @@ -0,0 +1,73 @@ +//------------------------------------------------------------------------------ +/* + https://github.com/vinniefalco/LuaBridge + + Copyright 2012, Vinnie Falco + + License: The MIT License (http://www.opensource.org/licenses/mit-license.php) + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ +//============================================================================== + +/** Unique Lua registry keys for a class. + + Each registered class inserts three keys into the registry, whose + values are the corresponding static, class, and const metatables. This + allows a quick and reliable lookup for a metatable from a template type. +*/ +template +class ClassInfo +{ +public: + /** Get the key for the static table. + + The static table holds the static data members, static properties, and + static member functions for a class. + */ + static void const* getStaticKey () + { + static char value; + return &value; + } + + /** Get the key for the class table. + + The class table holds the data members, properties, and member functions + of a class. Read-only data and properties, and const member functions are + also placed here (to save a lookup in the const table). + */ + static void const* getClassKey () + { + static char value; + return &value; + } + + /** Get the key for the const table. + + The const table holds read-only data members and properties, and const + member functions of a class. + */ + static void const* getConstKey () + { + static char value; + return &value; + } +}; + diff --git a/contrib/src/LuaBridge/detail/Constructor.h b/contrib/src/LuaBridge/detail/Constructor.h new file mode 100644 index 0000000..7b2dad0 --- /dev/null +++ b/contrib/src/LuaBridge/detail/Constructor.h @@ -0,0 +1,204 @@ +//------------------------------------------------------------------------------ +/* + https://github.com/vinniefalco/LuaBridge + + Copyright 2012, Vinnie Falco + Copyright 2007, Nathan Reed + + License: The MIT License (http://www.opensource.org/licenses/mit-license.php) + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ +//============================================================================== + +#ifndef LUABRIDGE_CONSTRUCTOR_HEADER +#define LUABRIDGE_CONSTRUCTOR_HEADER + +/* +* Constructor generators. These templates allow you to call operator new and +* pass the contents of a type/value list to the Constructor. Like the +* function pointer containers, these are only defined up to 8 parameters. +*/ + +/** Constructor generators. + + These templates call operator new with the contents of a type/value + list passed to the Constructor with up to 8 parameters. Two versions + of call() are provided. One performs a regular new, the other performs + a placement new. +*/ +template +struct Constructor {}; + +template +struct Constructor +{ + static T* call (TypeListValues const&) + { + return new T; + } + static T* call (void* mem, TypeListValues const&) + { + return new (mem) T; + } +}; + +template +struct Constructor > +{ + static T* call (const TypeListValues > &tvl) + { + return new T(tvl.hd); + } + static T* call (void* mem, const TypeListValues > &tvl) + { + return new (mem) T(tvl.hd); + } +}; + +template +struct Constructor > > +{ + static T* call (const TypeListValues > > &tvl) + { + return new T(tvl.hd, tvl.tl.hd); + } + static T* call (void* mem, const TypeListValues > > &tvl) + { + return new (mem) T(tvl.hd, tvl.tl.hd); + } +}; + +template +struct Constructor > > > +{ + static T* call (const TypeListValues > > > &tvl) + { + return new T(tvl.hd, tvl.tl.hd, tvl.tl.tl.hd); + } + static T* call (void* mem, const TypeListValues > > > &tvl) + { + return new (mem) T(tvl.hd, tvl.tl.hd, tvl.tl.tl.hd); + } +}; + +template +struct Constructor > > > > +{ + static T* call (const TypeListValues > > > > &tvl) + { + return new T(tvl.hd, tvl.tl.hd, tvl.tl.tl.hd, tvl.tl.tl.tl.hd); + } + static T* call (void* mem, const TypeListValues > > > > &tvl) + { + return new (mem) T(tvl.hd, tvl.tl.hd, tvl.tl.tl.hd, tvl.tl.tl.tl.hd); + } +}; + +template +struct Constructor > > > > > +{ + static T* call (const TypeListValues > > > > > &tvl) + { + return new T(tvl.hd, tvl.tl.hd, tvl.tl.tl.hd, tvl.tl.tl.tl.hd, + tvl.tl.tl.tl.tl.hd); + } + static T* call (void* mem, const TypeListValues > > > > > &tvl) + { + return new (mem) T(tvl.hd, tvl.tl.hd, tvl.tl.tl.hd, tvl.tl.tl.tl.hd, + tvl.tl.tl.tl.tl.hd); + } +}; + +template +struct Constructor > > > > > > +{ + static T* call (const TypeListValues > > > > > > &tvl) + { + return new T(tvl.hd, tvl.tl.hd, tvl.tl.tl.hd, tvl.tl.tl.tl.hd, + tvl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.hd); + } + static T* call (void* mem, const TypeListValues > > > > > > &tvl) + { + return new (mem) T(tvl.hd, tvl.tl.hd, tvl.tl.tl.hd, tvl.tl.tl.tl.hd, + tvl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.hd); + } +}; + +template +struct Constructor > > > > > > > +{ + static T* call (const TypeListValues > > > > > > > &tvl) + { + return new T(tvl.hd, tvl.tl.hd, tvl.tl.tl.hd, tvl.tl.tl.tl.hd, + tvl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.hd, + tvl.tl.tl.tl.tl.tl.tl.hd); + } + static T* call (void* mem, const TypeListValues > > > > > > > &tvl) + { + return new (mem) T(tvl.hd, tvl.tl.hd, tvl.tl.tl.hd, tvl.tl.tl.tl.hd, + tvl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.hd, + tvl.tl.tl.tl.tl.tl.tl.hd); + } +}; + +template +struct Constructor > > > > > > > > +{ + static T* call (const TypeListValues > > > > > > > > &tvl) + { + return new T(tvl.hd, tvl.tl.hd, tvl.tl.tl.hd, tvl.tl.tl.tl.hd, + tvl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.hd, + tvl.tl.tl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.tl.tl.hd); + } + static T* call (void* mem, const TypeListValues > > > > > > > > &tvl) + { + return new (mem) T(tvl.hd, tvl.tl.hd, tvl.tl.tl.hd, tvl.tl.tl.tl.hd, + tvl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.hd, + tvl.tl.tl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.tl.tl.hd); + } +}; + +#endif diff --git a/contrib/src/LuaBridge/detail/FuncTraits.h b/contrib/src/LuaBridge/detail/FuncTraits.h new file mode 100644 index 0000000..7eccb61 --- /dev/null +++ b/contrib/src/LuaBridge/detail/FuncTraits.h @@ -0,0 +1,852 @@ +//------------------------------------------------------------------------------ +/* + https://github.com/vinniefalco/LuaBridge + + Copyright 2012, Vinnie Falco + + License: The MIT License (http://www.opensource.org/licenses/mit-license.php) + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ +//============================================================================== + +/** + Since the throw specification is part of a function signature, the FuncTraits + family of templates needs to be specialized for both types. The + LUABRIDGE_THROWSPEC macro controls whether we use the 'throw ()' form, or + 'noexcept' (if C++11 is available) to distinguish the functions. +*/ +#if defined (__APPLE_CPP__) || defined(__APPLE_CC__) || defined(__clang__) || defined(__GNUC__) || \ + (defined (_MSC_VER) && (_MSC_VER >= 1700)) +// Do not define LUABRIDGE_THROWSPEC since the Xcode and gcc compilers do not +// distinguish the throw specification in the function signature. +#else +// Visual Studio 10 and earlier pay too much mind to useless throw() spec. +// +# define LUABRIDGE_THROWSPEC throw() +#endif + +//============================================================================== +/** + Traits for function pointers. + + There are three types of functions: global, non-const member, and const + member. These templates determine the type of function, which class type it + belongs to if it is a class member, the const-ness if it is a member + function, and the type information for the return value and argument list. + + Expansions are provided for functions with up to 8 parameters. This can be + manually extended, or expanded to an arbitrary amount using C++11 features. +*/ +template +struct FuncTraits +{ +}; + +/* Ordinary function pointers. */ + +template +struct FuncTraits +{ + static bool const isMemberFunction = false; + typedef D DeclType; + typedef R ReturnType; + typedef None Params; + static R call (D fp, TypeListValues ) + { + return fp (); + } +}; + +template +struct FuncTraits +{ + static bool const isMemberFunction = false; + typedef D DeclType; + typedef R ReturnType; + typedef TypeList Params; + static R call (D fp, TypeListValues tvl) + { + return fp (tvl.hd); + } +}; + +template +struct FuncTraits +{ + static bool const isMemberFunction = false; + typedef D DeclType; + typedef R ReturnType; + typedef TypeList > Params; + static R call (D fp, TypeListValues tvl) + { + return fp (tvl.hd, tvl.tl.hd); + } +}; + +template +struct FuncTraits +{ + static bool const isMemberFunction = false; + typedef D DeclType; + typedef R ReturnType; + typedef TypeList > > Params; + static R call (D fp, TypeListValues tvl) + { + return fp (tvl.hd, tvl.tl.hd, tvl.tl.tl.hd); + } +}; + +template +struct FuncTraits +{ + static bool const isMemberFunction = false; + typedef D DeclType; + typedef R ReturnType; + typedef TypeList > > > Params; + static R call (D fp, TypeListValues tvl) + { + return fp (tvl.hd, tvl.tl.hd, tvl.tl.tl.hd, tvl.tl.tl.tl.hd); + } +}; + +template +struct FuncTraits +{ + static bool const isMemberFunction = false; + typedef D DeclType; + typedef R ReturnType; + typedef TypeList > > > > Params; + static R call (D fp, TypeListValues tvl) + { + return fp (tvl.hd, tvl.tl.hd, tvl.tl.tl.hd, tvl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.hd); + } +}; + +template +struct FuncTraits +{ + static bool const isMemberFunction = false; + typedef D DeclType; + typedef R ReturnType; + typedef TypeList > > > > > Params; + static R call (D fp, TypeListValues tvl) + { + return fp (tvl.hd, tvl.tl.hd, tvl.tl.tl.hd, tvl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.hd); + } +}; + +template +struct FuncTraits +{ + static bool const isMemberFunction = false; + typedef D DeclType; + typedef R ReturnType; + typedef TypeList > > > > > > Params; + static R call (D fp, TypeListValues tvl) + { + return fp (tvl.hd, tvl.tl.hd, tvl.tl.tl.hd, tvl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.tl.hd); + } +}; + +template +struct FuncTraits +{ + static bool const isMemberFunction = false; + typedef D DeclType; + typedef R ReturnType; + typedef TypeList > > > > > > > Params; + static R call (D fp, TypeListValues tvl) + { + return fp (tvl.hd, tvl.tl.hd, tvl.tl.tl.hd, tvl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.tl.tl.hd); + } +}; + +/* Non-const member function pointers. */ + +template +struct FuncTraits +{ + static bool const isMemberFunction = true; + static bool const isConstMemberFunction = false; + typedef D DeclType; + typedef T ClassType; + typedef R ReturnType; + typedef None Params; + static R call (T* obj, D fp, TypeListValues ) + { + return (obj->*fp)(); + } +}; + +template +struct FuncTraits +{ + static bool const isMemberFunction = true; + static bool const isConstMemberFunction = false; + typedef D DeclType; + typedef T ClassType; + typedef R ReturnType; + typedef TypeList Params; + static R call (T* obj, D fp, TypeListValues tvl) + { + return (obj->*fp)(tvl.hd); + } +}; + +template +struct FuncTraits +{ + static bool const isMemberFunction = true; + static bool const isConstMemberFunction = false; + typedef D DeclType; + typedef T ClassType; + typedef R ReturnType; + typedef TypeList > Params; + static R call (T* obj, D fp, TypeListValues tvl) + { + return (obj->*fp)(tvl.hd, tvl.tl.hd); + } +}; + +template +struct FuncTraits +{ + static bool const isMemberFunction = true; + static bool const isConstMemberFunction = false; + typedef D DeclType; + typedef T ClassType; + typedef R ReturnType; + typedef TypeList > > Params; + static R call (T* obj, D fp, TypeListValues tvl) + { + return (obj->*fp)(tvl.hd, tvl.tl.hd, tvl.tl.tl.hd); + } +}; + +template +struct FuncTraits +{ + static bool const isMemberFunction = true; + static bool const isConstMemberFunction = false; + typedef D DeclType; + typedef T ClassType; + typedef R ReturnType; + typedef TypeList > > > Params; + static R call (T* obj, D fp, TypeListValues tvl) + { + return (obj->*fp)(tvl.hd, tvl.tl.hd, tvl.tl.tl.hd, tvl.tl.tl.tl.hd); + } +}; + +template +struct FuncTraits +{ + static bool const isMemberFunction = true; + static bool const isConstMemberFunction = false; + typedef D DeclType; + typedef T ClassType; + typedef R ReturnType; + typedef TypeList > > > > Params; + static R call (T* obj, D fp, TypeListValues tvl) + { + return (obj->*fp)(tvl.hd, tvl.tl.hd, tvl.tl.tl.hd, tvl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.hd); + } +}; + +template +struct FuncTraits +{ + static bool const isMemberFunction = true; + static bool const isConstMemberFunction = false; + typedef D DeclType; + typedef T ClassType; + typedef R ReturnType; + typedef TypeList > > > > > Params; + static R call (T* obj, D fp, TypeListValues tvl) + { + return (obj->*fp)(tvl.hd, tvl.tl.hd, tvl.tl.tl.hd, tvl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.hd); + } +}; + +template +struct FuncTraits +{ + static bool const isMemberFunction = true; + static bool const isConstMemberFunction = false; + typedef D DeclType; + typedef T ClassType; + typedef R ReturnType; + typedef TypeList > > > > > > Params; + static R call (T* obj, D fp, TypeListValues tvl) + { + return (obj->*fp)(tvl.hd, tvl.tl.hd, tvl.tl.tl.hd, tvl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.tl.hd); + } +}; + +template +struct FuncTraits +{ + static bool const isMemberFunction = true; + static bool const isConstMemberFunction = false; + typedef D DeclType; + typedef T ClassType; + typedef R ReturnType; + typedef TypeList > > > > > > > Params; + static R call (T* obj, D fp, TypeListValues tvl) + { + return (obj->*fp)(tvl.hd, tvl.tl.hd, tvl.tl.tl.hd, tvl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.tl.tl.hd); + } +}; + +/* Const member function pointers. */ + +template +struct FuncTraits +{ + static bool const isMemberFunction = true; + static bool const isConstMemberFunction = true; + typedef D DeclType; + typedef T ClassType; + typedef R ReturnType; + typedef None Params; + static R call (T const* obj, D fp, TypeListValues ) + { + return (obj->*fp)(); + } +}; + +template +struct FuncTraits +{ + static bool const isMemberFunction = true; + static bool const isConstMemberFunction = true; + typedef D DeclType; + typedef T ClassType; + typedef R ReturnType; + typedef TypeList Params; + static R call (T const* obj, D fp, TypeListValues tvl) + { + return (obj->*fp)(tvl.hd); + } +}; + +template +struct FuncTraits +{ + static bool const isMemberFunction = true; + static bool const isConstMemberFunction = true; + typedef D DeclType; + typedef T ClassType; + typedef R ReturnType; + typedef TypeList > Params; + static R call (T const* obj, R (T::*fp) (P1, P2) const, + TypeListValues tvl) + { + return (obj->*fp)(tvl.hd, tvl.tl.hd); + } +}; + +template +struct FuncTraits +{ + static bool const isMemberFunction = true; + static bool const isConstMemberFunction = true; + typedef D DeclType; + typedef T ClassType; + typedef R ReturnType; + typedef TypeList > > Params; + static R call (T const* obj, D fp, TypeListValues tvl) + { + return (obj->*fp)(tvl.hd, tvl.tl.hd, tvl.tl.tl.hd); + } +}; + +template +struct FuncTraits +{ + static bool const isMemberFunction = true; + static bool const isConstMemberFunction = true; + typedef D DeclType; + typedef T ClassType; + typedef R ReturnType; + typedef TypeList > > > Params; + static R call (T const* obj, D fp, TypeListValues tvl) + { + return (obj->*fp)(tvl.hd, tvl.tl.hd, tvl.tl.tl.hd, tvl.tl.tl.tl.hd); + } +}; + +template +struct FuncTraits +{ + static bool const isMemberFunction = true; + static bool const isConstMemberFunction = true; + typedef D DeclType; + typedef T ClassType; + typedef R ReturnType; + typedef TypeList > > > > Params; + static R call (T const* obj, D fp, TypeListValues tvl) + { + return (obj->*fp)(tvl.hd, tvl.tl.hd, tvl.tl.tl.hd, tvl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.hd); + } +}; + +template +struct FuncTraits +{ + static bool const isMemberFunction = true; + static bool const isConstMemberFunction = true; + typedef D DeclType; + typedef T ClassType; + typedef R ReturnType; + typedef TypeList > > > > > Params; + static R call (T const* obj, D fp, TypeListValues tvl) + { + return (obj->*fp)(tvl.hd, tvl.tl.hd, tvl.tl.tl.hd, tvl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.hd); + } +}; + +template +struct FuncTraits +{ + static bool const isMemberFunction = true; + static bool const isConstMemberFunction = true; + typedef D DeclType; + typedef T ClassType; + typedef R ReturnType; + typedef TypeList > > > > > > Params; + static R call (T const* obj, D fp, TypeListValues tvl) + { + return (obj->*fp)(tvl.hd, tvl.tl.hd, tvl.tl.tl.hd, tvl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.tl.hd); + } +}; + +template +struct FuncTraits +{ + static bool const isMemberFunction = true; + static bool const isConstMemberFunction = true; + typedef D DeclType; + typedef T ClassType; + typedef R ReturnType; + typedef TypeList > > > > > > > Params; + static R call (T const* obj, D fp, TypeListValues tvl) + { + return (obj->*fp)(tvl.hd, tvl.tl.hd, tvl.tl.tl.hd, tvl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.tl.tl.hd); + } +}; + +#if defined (LUABRIDGE_THROWSPEC) + +/* Ordinary function pointers. */ + +template +struct FuncTraits +{ + static bool const isMemberFunction = false; + typedef D DeclType; + typedef R ReturnType; + typedef None Params; + static R call (D fp, TypeListValues const&) + { + return fp (); + } +}; + +template +struct FuncTraits +{ + static bool const isMemberFunction = false; + typedef D DeclType; + typedef R ReturnType; + typedef TypeList Params; + static R call (D fp, TypeListValues tvl) + { + return fp (tvl.hd); + } +}; + +template +struct FuncTraits +{ + static bool const isMemberFunction = false; + typedef D DeclType; + typedef R ReturnType; + typedef TypeList > Params; + static R call (D fp, TypeListValues tvl) + { + return fp (tvl.hd, tvl.tl.hd); + } +}; + +template +struct FuncTraits +{ + static bool const isMemberFunction = false; + typedef D DeclType; + typedef R ReturnType; + typedef TypeList > > Params; + static R call (D fp, TypeListValues tvl) + { + return fp (tvl.hd, tvl.tl.hd, tvl.tl.tl.hd); + } +}; + +template +struct FuncTraits +{ + static bool const isMemberFunction = false; + typedef D DeclType; + typedef R ReturnType; + typedef TypeList > > > Params; + static R call (D fp, TypeListValues tvl) + { + return fp (tvl.hd, tvl.tl.hd, tvl.tl.tl.hd, tvl.tl.tl.tl.hd); + } +}; + +template +struct FuncTraits +{ + static bool const isMemberFunction = false; + typedef D DeclType; + typedef R ReturnType; + typedef TypeList > > > > Params; + static R call (D fp, TypeListValues tvl) + { + return fp (tvl.hd, tvl.tl.hd, tvl.tl.tl.hd, tvl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.hd); + } +}; + +template +struct FuncTraits +{ + static bool const isMemberFunction = false; + typedef D DeclType; + typedef R ReturnType; + typedef TypeList > > > > > Params; + static R call (D fp, TypeListValues tvl) + { + return fp (tvl.hd, tvl.tl.hd, tvl.tl.tl.hd, tvl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.hd); + } +}; + +template +struct FuncTraits +{ + static bool const isMemberFunction = false; + typedef D DeclType; + typedef R ReturnType; + typedef TypeList > > > > > > Params; + static R call (D fp, TypeListValues tvl) + { + return fp (tvl.hd, tvl.tl.hd, tvl.tl.tl.hd, tvl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.tl.hd); + } +}; + +template +struct FuncTraits +{ + static bool const isMemberFunction = false; + typedef D DeclType; + typedef R ReturnType; + typedef TypeList > > > > > > > Params; + static R call (D fp, TypeListValues tvl) + { + return fp (tvl.hd, tvl.tl.hd, tvl.tl.tl.hd, tvl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.tl.tl.hd); + } +}; + +/* Non-const member function pointers with THROWSPEC. */ + +template +struct FuncTraits +{ + static bool const isMemberFunction = true; + static bool const isConstMemberFunction = false; + typedef D DeclType; + typedef T ClassType; + typedef R ReturnType; + typedef None Params; + static R call (T* obj, D fp, TypeListValues const&) + { + return (obj->*fp)(); + } +}; + +template +struct FuncTraits +{ + static bool const isMemberFunction = true; + static bool const isConstMemberFunction = false; + typedef D DeclType; + typedef T ClassType; + typedef R ReturnType; + typedef TypeList Params; + static R call (T* obj, D fp, TypeListValues tvl) + { + return (obj->*fp)(tvl.hd); + } +}; + +template +struct FuncTraits +{ + static bool const isMemberFunction = true; + static bool const isConstMemberFunction = false; + typedef D DeclType; + typedef T ClassType; + typedef R ReturnType; + typedef TypeList > Params; + static R call (T* obj, D fp, TypeListValues tvl) + { + return (obj->*fp)(tvl.hd, tvl.tl.hd); + } +}; + +template +struct FuncTraits +{ + static bool const isMemberFunction = true; + static bool const isConstMemberFunction = false; + typedef D DeclType; + typedef T ClassType; + typedef R ReturnType; + typedef TypeList > > Params; + static R call (T* obj, D fp, TypeListValues tvl) + { + return (obj->*fp)(tvl.hd, tvl.tl.hd, tvl.tl.tl.hd); + } +}; + +template +struct FuncTraits +{ + static bool const isMemberFunction = true; + static bool const isConstMemberFunction = false; + typedef D DeclType; + typedef T ClassType; + typedef R ReturnType; + typedef TypeList > > > Params; + static R call (T* obj, D fp, TypeListValues tvl) + { + return (obj->*fp)(tvl.hd, tvl.tl.hd, tvl.tl.tl.hd, tvl.tl.tl.tl.hd); + } +}; + +template +struct FuncTraits +{ + static bool const isMemberFunction = true; + static bool const isConstMemberFunction = false; + typedef D DeclType; + typedef T ClassType; + typedef R ReturnType; + typedef TypeList > > > > Params; + static R call (T* obj, D fp, TypeListValues tvl) + { + return (obj->*fp)(tvl.hd, tvl.tl.hd, tvl.tl.tl.hd, tvl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.hd); + } +}; + +template +struct FuncTraits +{ + static bool const isMemberFunction = true; + static bool const isConstMemberFunction = false; + typedef D DeclType; + typedef T ClassType; + typedef R ReturnType; + typedef TypeList > > > > > Params; + static R call (T* obj, D fp, TypeListValues tvl) + { + return (obj->*fp)(tvl.hd, tvl.tl.hd, tvl.tl.tl.hd, tvl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.hd); + } +}; + +template +struct FuncTraits +{ + static bool const isMemberFunction = true; + static bool const isConstMemberFunction = false; + typedef D DeclType; + typedef T ClassType; + typedef R ReturnType; + typedef TypeList > > > > > > Params; + static R call (T* obj, D fp, TypeListValues tvl) + { + return (obj->*fp)(tvl.hd, tvl.tl.hd, tvl.tl.tl.hd, tvl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.tl.hd); + } +}; + +template +struct FuncTraits +{ + static bool const isMemberFunction = true; + static bool const isConstMemberFunction = false; + typedef D DeclType; + typedef T ClassType; + typedef R ReturnType; + typedef TypeList > > > > > > > Params; + static R call (T* obj, D fp, TypeListValues tvl) + { + return (obj->*fp)(tvl.hd, tvl.tl.hd, tvl.tl.tl.hd, tvl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.tl.tl.hd); + } +}; + +/* Const member function pointers with THROWSPEC. */ + +template +struct FuncTraits +{ + static bool const isMemberFunction = true; + static bool const isConstMemberFunction = true; + typedef D DeclType; + typedef T ClassType; + typedef R ReturnType; + typedef None Params; + static R call (T const* obj, D fp, TypeListValues ) + { + return (obj->*fp)(); + } +}; + +template +struct FuncTraits +{ + static bool const isMemberFunction = true; + static bool const isConstMemberFunction = true; + typedef D DeclType; + typedef T ClassType; + typedef R ReturnType; + typedef TypeList Params; + static R call (T const* obj, D fp, TypeListValues tvl) + { + return (obj->*fp)(tvl.hd); + } +}; + +template +struct FuncTraits +{ + static bool const isMemberFunction = true; + static bool const isConstMemberFunction = true; + typedef D DeclType; + typedef T ClassType; + typedef R ReturnType; + typedef TypeList > Params; + static R call (T const* obj, D fp, TypeListValues tvl) + { + return (obj->*fp)(tvl.hd, tvl.tl.hd); + } +}; + +template +struct FuncTraits +{ + static bool const isMemberFunction = true; + static bool const isConstMemberFunction = true; + typedef D DeclType; + typedef T ClassType; + typedef R ReturnType; + typedef TypeList > > Params; + static R call (T const* obj, D fp, TypeListValues tvl) + { + return (obj->*fp)(tvl.hd, tvl.tl.hd, tvl.tl.tl.hd); + } +}; + +template +struct FuncTraits +{ + static bool const isMemberFunction = true; + static bool const isConstMemberFunction = true; + typedef D DeclType; + typedef T ClassType; + typedef R ReturnType; + typedef TypeList > > > Params; + static R call (T const* obj, D fp, TypeListValues tvl) + { + return (obj->*fp)(tvl.hd, tvl.tl.hd, tvl.tl.tl.hd, tvl.tl.tl.tl.hd); + } +}; + +template +struct FuncTraits +{ + static bool const isMemberFunction = true; + static bool const isConstMemberFunction = true; + typedef D DeclType; + typedef T ClassType; + typedef R ReturnType; + typedef TypeList > > > > Params; + static R call (T const* obj, D fp, TypeListValues tvl) + { + return (obj->*fp)(tvl.hd, tvl.tl.hd, tvl.tl.tl.hd, tvl.tl.tl.tl.hd, + tvl.tl.tl.tl.tl.hd); + } +}; + +template +struct FuncTraits +{ + static bool const isMemberFunction = true; + static bool const isConstMemberFunction = true; + typedef D DeclType; + typedef T ClassType; + typedef R ReturnType; + typedef TypeList > > > > > Params; + static R call (T const* obj, D fp, TypeListValues tvl) + { + return (obj->*fp)(tvl.hd, tvl.tl.hd, tvl.tl.tl.hd, tvl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.hd); + } +}; + +template +struct FuncTraits +{ + static bool const isMemberFunction = true; + static bool const isConstMemberFunction = true; + typedef D DeclType; + typedef T ClassType; + typedef R ReturnType; + typedef TypeList > > > > > > Params; + static R call (T const* obj, D fp, TypeListValues tvl) + { + return (obj->*fp)(tvl.hd, tvl.tl.hd, tvl.tl.tl.hd, tvl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.tl.hd); + } +}; + +template +struct FuncTraits +{ + static bool const isMemberFunction = true; + static bool const isConstMemberFunction = true; + typedef D DeclType; + typedef T ClassType; + typedef R ReturnType; + typedef TypeList > > > > > > > Params; + static R call (T const* obj, D fp, TypeListValues tvl) + { + return (obj->*fp)(tvl.hd, tvl.tl.hd, tvl.tl.tl.hd, tvl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.tl.hd, tvl.tl.tl.tl.tl.tl.tl.tl.hd); + } +}; + +#endif diff --git a/contrib/src/LuaBridge/detail/Iterator.h b/contrib/src/LuaBridge/detail/Iterator.h new file mode 100644 index 0000000..d883fb3 --- /dev/null +++ b/contrib/src/LuaBridge/detail/Iterator.h @@ -0,0 +1,114 @@ +//------------------------------------------------------------------------------ +/* + https://github.com/vinniefalco/LuaBridge + + Copyright 2012, Vinnie Falco + + License: The MIT License (http://www.opensource.org/licenses/mit-license.php) + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ +//============================================================================== + +/** Allows table iteration. +*/ +class Iterator +{ +private: + lua_State* m_L; + LuaRef m_table; + LuaRef m_key; + LuaRef m_value; + + void next () + { + m_table.push(m_L); + m_key.push (m_L); + if (lua_next (m_L, -2)) + { + m_value.pop (m_L); + m_key.pop (m_L); + } + else + { + m_key = Nil(); + m_value = Nil(); + } + lua_pop(m_L, 1); + } + +public: + explicit Iterator (LuaRef table) + : m_L (table.state ()) + , m_table (table) + , m_key (table.state ()) // m_key is nil + , m_value (table.state ()) // m_value is nil + { + next (); // get the first (key, value) pair from table + } + + lua_State* state () const + { + return m_L; + } + + LuaRef operator* () const + { + return m_value; + } + + LuaRef operator-> () const + { + return m_value; + } + + Iterator& operator++ () + { + if (isNil()) + { + // if the iterator reaches the end, do nothing + return *this; + } + else + { + next(); + return *this; + } + } + + inline bool isNil () const + { + return m_key.isNil (); + } + + inline LuaRef key () const + { + return m_key; + } + + inline LuaRef value () const + { + return m_value; + } + +private: + // Don't use postfix increment, it is less efficient + Iterator operator++ (int); +}; + diff --git a/contrib/src/LuaBridge/detail/LuaException.h b/contrib/src/LuaBridge/detail/LuaException.h new file mode 100644 index 0000000..a094496 --- /dev/null +++ b/contrib/src/LuaBridge/detail/LuaException.h @@ -0,0 +1,113 @@ +//------------------------------------------------------------------------------ +/* + https://github.com/vinniefalco/LuaBridge + + Copyright 2012, Vinnie Falco + Copyright 2008, Nigel Atkinson + + License: The MIT License (http://www.opensource.org/licenses/mit-license.php) + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ +//============================================================================== + +class LuaException : public std::exception +{ +private: + lua_State* m_L; + std::string m_what; + +public: + //---------------------------------------------------------------------------- + /** + Construct a LuaException after a lua_pcall(). + */ + LuaException (lua_State* L, int /*code*/) + : m_L (L) + { + whatFromStack (); + } + + //---------------------------------------------------------------------------- + + LuaException (lua_State *L, + char const*, + char const*, + long) + : m_L (L) + { + whatFromStack (); + } + + //---------------------------------------------------------------------------- + + ~LuaException() throw () + { + } + + //---------------------------------------------------------------------------- + + char const* what() const throw () + { + return m_what.c_str(); + } + + //============================================================================ + /** + Throw an exception. + + This centralizes all the exceptions thrown, so that we can set + breakpoints before the stack is unwound, or otherwise customize the + behavior. + */ + template + static void Throw (Exception e) + { + throw e; + } + + //---------------------------------------------------------------------------- + /** + Wrapper for lua_pcall that throws. + */ + static void pcall (lua_State* L, int nargs = 0, int nresults = 0, int msgh = 0) + { + int code = lua_pcall (L, nargs, nresults, msgh); + + if (code != LUABRIDGE_LUA_OK) + Throw (LuaException (L, code)); + } + + //---------------------------------------------------------------------------- + +protected: + void whatFromStack () + { + if (lua_gettop (m_L) > 0) + { + char const* s = lua_tostring (m_L, -1); + m_what = s ? s : ""; + } + else + { + // stack is empty + m_what = "missing error"; + } + } +}; diff --git a/contrib/src/LuaBridge/detail/LuaHelpers.h b/contrib/src/LuaBridge/detail/LuaHelpers.h new file mode 100644 index 0000000..7bc84eb --- /dev/null +++ b/contrib/src/LuaBridge/detail/LuaHelpers.h @@ -0,0 +1,143 @@ +//------------------------------------------------------------------------------ +/* + https://github.com/vinniefalco/LuaBridge + + Copyright 2012, Vinnie Falco + Copyright 2007, Nathan Reed + + License: The MIT License (http://www.opensource.org/licenses/mit-license.php) + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ +//============================================================================== + +// These are for Lua versions prior to 5.2.0. +// +#if LUA_VERSION_NUM < 502 +inline int lua_absindex (lua_State* L, int idx) +{ + if (idx > LUA_REGISTRYINDEX && idx < 0) + return lua_gettop (L) + idx + 1; + else + return idx; +} + +inline void lua_rawgetp (lua_State* L, int idx, void const* p) +{ + idx = lua_absindex (L, idx); + lua_pushlightuserdata (L, const_cast (p)); + lua_rawget (L,idx); +} + +inline void lua_rawsetp (lua_State* L, int idx, void const* p) +{ + idx = lua_absindex (L, idx); + lua_pushlightuserdata (L, const_cast (p)); + // put key behind value + lua_insert (L, -2); + lua_rawset (L, idx); +} + +#define LUA_OPEQ 1 +#define LUA_OPLT 2 +#define LUA_OPLE 3 + +inline int lua_compare (lua_State* L, int idx1, int idx2, int op) +{ + switch (op) + { + case LUA_OPEQ: + return lua_equal (L, idx1, idx2); + break; + + case LUA_OPLT: + return lua_lessthan (L, idx1, idx2); + break; + + case LUA_OPLE: + return lua_equal (L, idx1, idx2) || lua_lessthan (L, idx1, idx2); + break; + + default: + return 0; + }; +} + +inline int get_length (lua_State* L, int idx) +{ + return int (lua_objlen (L, idx)); +} + +#else +inline int get_length (lua_State* L, int idx) +{ + lua_len (L, idx); + int len = int (luaL_checknumber (L, -1)); + lua_pop (L, 1); + return len; +} + +#endif + +#ifndef LUA_OK +# define LUABRIDGE_LUA_OK 0 +#else +# define LUABRIDGE_LUA_OK LUA_OK +#endif + +/** Get a table value, bypassing metamethods. +*/ +inline void rawgetfield (lua_State* L, int index, char const* key) +{ + assert (lua_istable (L, index)); + index = lua_absindex (L, index); + lua_pushstring (L, key); + lua_rawget (L, index); +} + +/** Set a table value, bypassing metamethods. +*/ +inline void rawsetfield (lua_State* L, int index, char const* key) +{ + assert (lua_istable (L, index)); + index = lua_absindex (L, index); + lua_pushstring (L, key); + lua_insert (L, -2); + lua_rawset (L, index); +} + +/** Returns true if the value is a full userdata (not light). +*/ +inline bool isfulluserdata (lua_State* L, int index) +{ + return lua_isuserdata (L, index) && !lua_islightuserdata (L, index); +} + +/** Test lua_State objects for global equality. + + This can determine if two different lua_State objects really point + to the same global state, such as when using coroutines. + + @note This is used for assertions. +*/ +inline bool equalstates (lua_State* L1, lua_State* L2) +{ + return lua_topointer (L1, LUA_REGISTRYINDEX) == + lua_topointer (L2, LUA_REGISTRYINDEX); +} diff --git a/contrib/src/LuaBridge/detail/LuaRef.h b/contrib/src/LuaBridge/detail/LuaRef.h new file mode 100644 index 0000000..e726bca --- /dev/null +++ b/contrib/src/LuaBridge/detail/LuaRef.h @@ -0,0 +1,1215 @@ +//------------------------------------------------------------------------------ +/* + https://github.com/vinniefalco/LuaBridge + + Copyright 2012, Vinnie Falco + Copyright 2008, Nigel Atkinson + + License: The MIT License (http://www.opensource.org/licenses/mit-license.php) + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ +//============================================================================== + +//------------------------------------------------------------------------------ +/** + Type tag for representing LUA_TNIL. + + Construct one of these using `Nil()` to represent a Lua nil. This is faster + than creating a reference in the registry to nil. Example: + + LuaRef t (LuaRef::createTable (L)); + ... + t ["k"] = Nil(); // assign nil +*/ +struct Nil +{ +}; + +//------------------------------------------------------------------------------ +/** + Lightweight reference to a Lua object. + + The reference is maintained for the lifetime of the C++ object. +*/ +class LuaRef +{ +private: + class Proxy; + friend struct Stack ; + + //---------------------------------------------------------------------------- + /** + Pop the Lua stack. + + Pops the specified number of stack items on destruction. We use this + when returning objects, to avoid an explicit temporary variable, since + the destructor executes after the return statement. For example: + + template + U cast (lua_State* L) + { + StackPop p (L, 1); + ... + return U (); // dtor called after this line + } + + @note The `StackPop` object must always be a named local variable. + */ + class StackPop + { + public: + /** Create a StackPop object. + + @param count The number of stack entries to pop on destruction. + */ + StackPop (lua_State* L, int count) + : m_L (L) + , m_count (count) + { + } + + ~StackPop () + { + lua_pop (m_L, m_count); + } + + private: + lua_State* m_L; + int m_count; + }; + + //---------------------------------------------------------------------------- + /** + A proxy for representing table values. + */ + class Proxy + { + private: + lua_State* m_L; + int m_tableRef; + int m_keyRef; + + public: + //-------------------------------------------------------------------------- + /** + Construct a Proxy from a table value. + + The table is in the registry, and the key is at the top of the stack. + The key is popped off the stack. + */ + Proxy (lua_State* L, int tableRef) + : m_L (L) + , m_tableRef (tableRef) + , m_keyRef (luaL_ref (L, LUA_REGISTRYINDEX)) + { + } + + //-------------------------------------------------------------------------- + /** + Create a Proxy via copy constructor. + + It is best to avoid code paths that invoke this, because it creates + an extra temporary Lua reference. Typically this is done by passing + the Proxy parameter as a `const` reference. + */ + Proxy (Proxy const& other) + : m_L (other.m_L) + , m_tableRef (other.m_tableRef) + { + // If this assert goes off it means code is taking this path, + // which is better avoided. + // + assert (0); + + lua_rawgeti (m_L, LUA_REGISTRYINDEX, other.m_keyRef); + m_keyRef = luaL_ref (m_L, LUA_REGISTRYINDEX); + } + + //-------------------------------------------------------------------------- + /** + Destroy the proxy. + + This does not destroy the table value. + */ + ~Proxy () + { + luaL_unref (m_L, LUA_REGISTRYINDEX, m_keyRef); + } + + //-------------------------------------------------------------------------- + /** + Return a reference to the table value. + */ + int createRef () const + { + push (m_L); + return luaL_ref (m_L, LUA_REGISTRYINDEX); + } + + //-------------------------------------------------------------------------- + /** + Assign a new value to this table key. + + This may invoke metamethods. + */ + template + Proxy& operator= (T v) + { + StackPop p (m_L, 1); + lua_rawgeti (m_L, LUA_REGISTRYINDEX, m_tableRef); + lua_rawgeti (m_L, LUA_REGISTRYINDEX, m_keyRef); + Stack ::push (m_L, v); + lua_rawset (m_L, -3); + return *this; + } + + //-------------------------------------------------------------------------- + /** + Assign a new value to this table key. + + The assignment is raw, no metamethods are invoked. + */ + template + Proxy& rawset (T v) + { + StackPop p (m_L, 1); + lua_rawgeti (m_L, LUA_REGISTRYINDEX, m_tableRef); + lua_rawgeti (m_L, LUA_REGISTRYINDEX, m_keyRef); + Stack ::push (m_L, v); + lua_settable (m_L, -3); + return *this; + } + + //========================================================================== + // + // This group of member functions mirrors the member functions in LuaRef. + + /** Retrieve the lua_State associated with the table value. + */ + lua_State* state () const + { + return m_L; + } + + //-------------------------------------------------------------------------- + /** + Push the value onto the Lua stack. + */ + void push (lua_State* L) const + { + assert (equalstates (L, m_L)); + lua_rawgeti (L, LUA_REGISTRYINDEX, m_tableRef); + lua_rawgeti (L, LUA_REGISTRYINDEX, m_keyRef); + lua_gettable (L, -2); + lua_remove (L, -2); // remove the table + } + + //-------------------------------------------------------------------------- + /** + Determine the object type. + + The return values are the same as for `lua_type`. + */ + int type () const + { + int result; + push (m_L); + result = lua_type (m_L, -1); + lua_pop (m_L, 1); + return result; + } + + inline bool isNil () const { return type () == LUA_TNIL; } + inline bool isNumber () const { return type () == LUA_TNUMBER; } + inline bool isString () const { return type () == LUA_TSTRING; } + inline bool isTable () const { return type () == LUA_TTABLE; } + inline bool isFunction () const { return type () == LUA_TFUNCTION; } + inline bool isUserdata () const { return type () == LUA_TUSERDATA; } + inline bool isThread () const { return type () == LUA_TTHREAD; } + inline bool isLightUserdata () const { return type () == LUA_TLIGHTUSERDATA; } + + //-------------------------------------------------------------------------- + /** + Perform an explicit conversion. + */ + template + T cast () const + { + StackPop p (m_L, 1); + push (m_L); + + // lua_gettop is used because Userdata::getClass() doesn't handle + // negative stack indexes. + // + return Stack ::get (m_L, lua_gettop (m_L)); + } + + //-------------------------------------------------------------------------- + /** + Universal implicit conversion operator. + + NOTE: Visual Studio 2010 and 2012 have a bug where this function + is not used. See: + + http://social.msdn.microsoft.com/Forums/en-US/vcgeneral/thread/e30b2664-a92d-445c-9db2-e8e0fbde2014 + https://connect.microsoft.com/VisualStudio/feedback/details/771509/correct-code-doesnt-compile + + // This code snippet fails to compile in vs2010,vs2012 + struct S { + template inline operator T () const { return T (); } + }; + int main () { + S () || false; + return 0; + } + */ + template + inline operator T () const + { + return cast (); + } + + //-------------------------------------------------------------------------- + /** + Universal comparison operators. + */ + /** @{ */ + template + bool operator== (T rhs) const + { + StackPop p (m_L, 2); + push (m_L); + Stack ::push (m_L, rhs); + return lua_compare (m_L, -2, -1, LUA_OPEQ) == 1; + } + + template + bool operator< (T rhs) const + { + StackPop p (m_L, 2); + push (m_L); + Stack ::push (m_L, rhs); + return lua_compare (m_L, -2, -1, LUA_OPLT) == 1; + } + + template + bool operator<= (T rhs) const + { + StackPop p (m_L, 2); + push (m_L); + Stack ::push (m_L, rhs); + return lua_compare (m_L, -2, -1, LUA_OPLE) == 1; + } + + template + bool operator> (T rhs) const + { + StackPop p (m_L, 2); + push (m_L); + Stack ::push (m_L, rhs); + return lua_compare (m_L, -1, -2, LUA_OPLT) == 1; + } + + template + bool operator>= (T rhs) const + { + StackPop p (m_L, 2); + push (m_L); + Stack ::push (m_L, rhs); + return lua_compare (m_L, -1, -2, LUA_OPLE) == 1; + } + + template + bool rawequal (T rhs) const + { + StackPop p (m_L, 2); + push (m_L); + Stack ::push (m_L, rhs); + return lua_rawequal (m_L, -1, -2) == 1; + } + /** @} */ + + //-------------------------------------------------------------------------- + /** + Access a table value using a key. + + This invokes metamethods. + */ + template + Proxy operator[] (T key) const + { + return LuaRef (*this) [key]; + } + + //-------------------------------------------------------------------------- + /** + Access a table value using a key. + + The operation is raw, metamethods are not invoked. The result is + passed by value and may not be modified. + */ + template + LuaRef rawget (T key) const + { + StackPop (m_L, 1); + push (m_L); + Stack ::push (m_L, key); + lua_rawget (m_L, -2); + return LuaRef (m_L, FromStack ()); + } + + //-------------------------------------------------------------------------- + /** + Append a value to the table. + + If the table is a sequence this will add another element to it. + */ + template + void append (T v) const + { + push (m_L); + Stack ::push (m_L, v); + luaL_ref (m_L, -2); + lua_pop (m_L, 1); + } + + //-------------------------------------------------------------------------- + /** + Call the length operator. + + This is identical to applying the Lua # operator. + */ + int length () const + { + StackPop p (m_L, 1); + push (m_L); + return get_length (m_L, -1); + } + + //-------------------------------------------------------------------------- + /** + Call Lua code. + + These overloads allow Lua code to be called with up to 8 parameters. + The return value is provided as a LuaRef (which may be LUA_REFNIL). + If an error occurs, a LuaException is thrown. + */ + /** @{ */ + LuaRef const operator() () const + { + push (m_L); + LuaException::pcall (m_L, 0, 1); + return LuaRef (m_L, FromStack ()); + } + + template + LuaRef const operator() (P1 p1) const + { + push (m_L); + Stack ::push (m_L, p1); + LuaException::pcall (m_L, 1, 1); + return LuaRef (m_L, FromStack ()); + } + + template + LuaRef const operator() (P1 p1, P2 p2) const + { + push (m_L); + Stack ::push (m_L, p1); + Stack ::push (m_L, p2); + LuaException::pcall (m_L, 2, 1); + return LuaRef (m_L, FromStack ()); + } + + template + LuaRef const operator() (P1 p1, P2 p2, P3 p3) const + { + push (m_L); + Stack ::push (m_L, p1); + Stack ::push (m_L, p2); + Stack ::push (m_L, p3); + LuaException::pcall (m_L, 3, 1); + return LuaRef (m_L, FromStack ()); + } + + template + LuaRef const operator() (P1 p1, P2 p2, P3 p3, P4 p4) const + { + push (m_L); + Stack ::push (m_L, p1); + Stack ::push (m_L, p2); + Stack ::push (m_L, p3); + Stack ::push (m_L, p4); + LuaException::pcall (m_L, 4, 1); + return LuaRef (m_L, FromStack ()); + } + + template + LuaRef const operator() (P1 p1, P2 p2, P3 p3, P4 p4, P5 p5) const + { + push (m_L); + Stack ::push (m_L, p1); + Stack ::push (m_L, p2); + Stack ::push (m_L, p3); + Stack ::push (m_L, p4); + Stack ::push (m_L, p5); + LuaException::pcall (m_L, 5, 1); + return LuaRef (m_L, FromStack ()); + } + + template + LuaRef const operator() (P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6) const + { + push (m_L); + Stack ::push (m_L, p1); + Stack ::push (m_L, p2); + Stack ::push (m_L, p3); + Stack ::push (m_L, p4); + Stack ::push (m_L, p5); + Stack ::push (m_L, p6); + LuaException::pcall (m_L, 6, 1); + return LuaRef (m_L, FromStack ()); + } + + template + LuaRef const operator() (P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6, P7 p7) const + { + push (m_L); + Stack ::push (m_L, p1); + Stack ::push (m_L, p2); + Stack ::push (m_L, p3); + Stack ::push (m_L, p4); + Stack ::push (m_L, p5); + Stack ::push (m_L, p6); + Stack ::push (m_L, p7); + LuaException::pcall (m_L, 7, 1); + return LuaRef (m_L, FromStack ()); + } + + template + LuaRef const operator() (P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6, P7 p7, P8 p8) const + { + push (m_L); + Stack ::push (m_L, p1); + Stack ::push (m_L, p2); + Stack ::push (m_L, p3); + Stack ::push (m_L, p4); + Stack ::push (m_L, p5); + Stack ::push (m_L, p6); + Stack ::push (m_L, p7); + Stack ::push (m_L, p8); + LuaException::pcall (m_L, 8, 1); + return LuaRef (m_L, FromStack ()); + } + /** @} */ + + //========================================================================== + }; + +private: + friend struct Stack ; + + //---------------------------------------------------------------------------- + /** + Type tag for stack construction. + */ + struct FromStack { }; + + //---------------------------------------------------------------------------- + /** + Create a reference to an object at the top of the Lua stack and pop it. + + This constructor is private and not invoked directly. + Instead, use the `fromStack` function. + + @note The object is popped. + */ + LuaRef (lua_State* L, FromStack) + : m_L (L) + { + m_ref = luaL_ref (m_L, LUA_REGISTRYINDEX); + } + + //---------------------------------------------------------------------------- + /** + Create a reference to an object on the Lua stack. + + This constructor is private and not invoked directly. + Instead, use the `fromStack` function. + + @note The object is not popped. + */ + LuaRef (lua_State* L, int index, FromStack) + : m_L (L) + { + lua_pushvalue (m_L, index); + m_ref = luaL_ref (m_L, LUA_REGISTRYINDEX); + } + + //---------------------------------------------------------------------------- + + // This type of construction is disallowed, since we don't have a `lua_State`. + // + template + LuaRef (T) + { + } + + //---------------------------------------------------------------------------- + /** + Create a reference to this ref. + + This is used internally. + */ + int createRef () const + { + if (m_ref != LUA_REFNIL) + { + push (m_L); + return luaL_ref (m_L, LUA_REGISTRYINDEX); + } + else + { + return LUA_REFNIL; + } + } + +public: + //---------------------------------------------------------------------------- + /** + Create a nil reference. + + The LuaRef may be assigned later. + */ + LuaRef (lua_State* L) + : m_L (L) + , m_ref (LUA_REFNIL) + { + } + + //---------------------------------------------------------------------------- + /** + Create a reference to a value. + */ + template + LuaRef (lua_State* L, T v) + : m_L (L) + { + Stack ::push (m_L, v); + m_ref = luaL_ref (m_L, LUA_REGISTRYINDEX); + } + + //---------------------------------------------------------------------------- + /** + Create a reference to a table value. + */ + LuaRef (Proxy const& v) + : m_L (v.state ()) + , m_ref (v.createRef ()) + { + } + + //---------------------------------------------------------------------------- + /** + Create a new reference to an existing reference. + */ + LuaRef (LuaRef const& other) + : m_L (other.m_L) + , m_ref (other.createRef ()) + { + } + + //---------------------------------------------------------------------------- + /** + Destroy a reference. + + The corresponding Lua registry reference will be released. + + @note If the state refers to a thread, it is the responsibility of the + caller to ensure that the thread still exists when the LuaRef + is destroyed. + */ + ~LuaRef () + { + luaL_unref (m_L, LUA_REGISTRYINDEX, m_ref); + } + + //---------------------------------------------------------------------------- + /** + Return a LuaRef from a stack item. + + The stack item is not popped. + */ + static LuaRef fromStack (lua_State* L, int index) + { + lua_pushvalue (L, index); + return LuaRef (L, FromStack ()); + } + + //---------------------------------------------------------------------------- + /** + Create a new empty table and return a reference to it. + + It is also possible to use the free function `newTable`. + + @see ::getGlobal + */ + static LuaRef newTable (lua_State* L) + { + lua_newtable (L); + return LuaRef (L, FromStack ()); + } + + //---------------------------------------------------------------------------- + /** + Return a reference to a named global. + + It is also possible to use the free function `getGlobal`. + + @see ::getGlobal + */ + static LuaRef getGlobal (lua_State *L, char const* name) + { + lua_getglobal (L, name); + return LuaRef (L, FromStack ()); + } + + //---------------------------------------------------------------------------- + /** + Assign a different value to this LuaRef. + */ + template + LuaRef& operator= (T rhs) + { + luaL_unref (m_L, LUA_REGISTRYINDEX, m_ref); + Stack ::push (m_L, rhs); + m_ref = luaL_ref (m_L, LUA_REGISTRYINDEX); + return *this; + } + + //---------------------------------------------------------------------------- + /** + Assign another LuaRef to this LuaRef. + */ + LuaRef& operator= (LuaRef const& rhs) + { + luaL_unref (m_L, LUA_REGISTRYINDEX, m_ref); + rhs.push (m_L); + m_L = rhs.state (); + m_ref = luaL_ref (m_L, LUA_REGISTRYINDEX); + return *this; + } + + //---------------------------------------------------------------------------- + /** + converts to a string using luas tostring function + */ + std::string tostring() const + { + lua_getglobal (m_L, "tostring"); + push (m_L); + lua_call (m_L, 1, 1); + const char* str = lua_tostring(m_L, 1); + lua_pop(m_L, 1); + return std::string(str); + } + + //---------------------------------------------------------------------------- + /** + Print a text description of the value to a stream. + + This is used for diagnostics. + */ + void print (std::ostream& os) const + { + switch (type ()) + { + case LUA_TNIL: + os << "nil"; + break; + + case LUA_TNUMBER: + os << cast (); + break; + + case LUA_TBOOLEAN: + os << (cast () ? "true" : "false"); + break; + + case LUA_TSTRING: + os << '"' << cast () << '"'; + break; + + case LUA_TTABLE: + os << "table: " << tostring(); + break; + + case LUA_TFUNCTION: + os << "function: " << tostring(); + break; + + case LUA_TUSERDATA: + os << "userdata: " << tostring(); + break; + + case LUA_TTHREAD: + os << "thread: " << tostring(); + break; + + case LUA_TLIGHTUSERDATA: + os << "lightuserdata: " << tostring(); + break; + + default: + os << "unknown"; + break; + } + } + + //============================================================================ + // + // This group of member functions is mirrored in Proxy + // + + /** Retrieve the lua_State associated with the reference. + */ + lua_State* state () const + { + return m_L; + } + + //---------------------------------------------------------------------------- + /** + Place the object onto the Lua stack. + */ + void push (lua_State* L) const + { + assert (equalstates (L, m_L)); + lua_rawgeti (L, LUA_REGISTRYINDEX, m_ref); + } + + //---------------------------------------------------------------------------- + /** + Pop the top of Lua stack and assign the ref to m_ref + */ + void pop (lua_State* L) + { + assert (equalstates (L, m_L)); + luaL_unref (m_L, LUA_REGISTRYINDEX, m_ref); + m_ref = luaL_ref (m_L, LUA_REGISTRYINDEX); + } + + //---------------------------------------------------------------------------- + /** + Determine the object type. + + The return values are the same as for `lua_type`. + */ + /** @{ */ + int type () const + { + int result; + if (m_ref != LUA_REFNIL) + { + push (m_L); + result = lua_type (m_L, -1); + lua_pop (m_L, 1); + } + else + { + result = LUA_TNIL; + } + + return result; + } + + // should never happen + //inline bool isNone () const { return m_ref == LUA_NOREF; } + + inline bool isNil () const { return type () == LUA_TNIL; } + inline bool isNumber () const { return type () == LUA_TNUMBER; } + inline bool isString () const { return type () == LUA_TSTRING; } + inline bool isTable () const { return type () == LUA_TTABLE; } + inline bool isFunction () const { return type () == LUA_TFUNCTION; } + inline bool isUserdata () const { return type () == LUA_TUSERDATA; } + inline bool isThread () const { return type () == LUA_TTHREAD; } + inline bool isLightUserdata () const { return type () == LUA_TLIGHTUSERDATA; } + /** @} */ + + //---------------------------------------------------------------------------- + /** + Perform an explicit conversion. + */ + template + T cast () const + { + StackPop p (m_L, 1); + push (m_L); + + // lua_gettop is used because Userdata::getClass() doesn't handle + // negative stack indexes. + // + return Stack ::get (m_L, lua_gettop (m_L)); + } + + //---------------------------------------------------------------------------- + /** + Universal implicit conversion operator. + + NOTE: Visual Studio 2010 and 2012 have a bug where this function + is not used. See: + + http://social.msdn.microsoft.com/Forums/en-US/vcgeneral/thread/e30b2664-a92d-445c-9db2-e8e0fbde2014 + https://connect.microsoft.com/VisualStudio/feedback/details/771509/correct-code-doesnt-compile + + // This code snippet fails to compile in vs2010,vs2012 + struct S { + template inline operator T () const { return T (); } + }; + int main () { + S () || false; + return 0; + } + */ + template + inline operator T () const + { + return cast (); + } + + //---------------------------------------------------------------------------- + /** + Universal comparison operators. + */ + /** @{ */ + template + bool operator== (T rhs) const + { + StackPop p (m_L, 2); + push (m_L); + Stack ::push (m_L, rhs); + return lua_compare (m_L, -2, -1, LUA_OPEQ) == 1; + } + + template + bool operator< (T rhs) const + { + StackPop p (m_L, 2); + push (m_L); + Stack ::push (m_L, rhs); + return lua_compare (m_L, -2, -1, LUA_OPLT) == 1; + } + + template + bool operator<= (T rhs) const + { + StackPop p (m_L, 2); + push (m_L); + Stack ::push (m_L, rhs); + return lua_compare (m_L, -2, -1, LUA_OPLE) == 1; + } + + template + bool operator> (T rhs) const + { + StackPop p (m_L, 2); + push (m_L); + Stack ::push (m_L, rhs); + return lua_compare (m_L, -1, -2, LUA_OPLT) == 1; + } + + template + bool operator>= (T rhs) const + { + StackPop p (m_L, 2); + push (m_L); + Stack ::push (m_L, rhs); + return lua_compare (m_L, -1, -2, LUA_OPLE) == 1; + } + + template + bool rawequal (T rhs) const + { + StackPop p (m_L, 2); + push (m_L); + Stack ::push (m_L, rhs); + return lua_rawequal (m_L, -1, -2) == 1; + } + /** @} */ + + //---------------------------------------------------------------------------- + /** + Append a value to the table. + + If the table is a sequence this will add another element to it. + */ + template + void append (T v) const + { + push (m_L); + Stack ::push (m_L, v); + luaL_ref (m_L, -2); + lua_pop (m_L, 1); + } + + //---------------------------------------------------------------------------- + /** + Call the length operator. + + This is identical to applying the Lua # operator. + */ + int length () const + { + StackPop p (m_L, 1); + push (m_L); + return get_length (m_L, -1); + } + + //---------------------------------------------------------------------------- + /** + Access a table value using a key. + + This invokes metamethods. + */ + template + Proxy operator[] (T key) const + { + Stack ::push (m_L, key); + return Proxy (m_L, m_ref); + } + + //---------------------------------------------------------------------------- + /** + Call Lua code. + + These overloads allow Lua code to be called with up to 8 parameters. + The return value is provided as a LuaRef (which may be LUA_REFNIL). + If an error occurs, a LuaException is thrown. + */ + /** @{ */ + LuaRef const operator() () const + { + push (m_L); + LuaException::pcall (m_L, 0, 1); + return LuaRef (m_L, FromStack ()); + } + + template + LuaRef const operator() (P1 p1) const + { + push (m_L); + Stack ::push (m_L, p1); + LuaException::pcall (m_L, 1, 1); + return LuaRef (m_L, FromStack ()); + } + + template + LuaRef const operator() (P1 p1, P2 p2) const + { + push (m_L); + Stack ::push (m_L, p1); + Stack ::push (m_L, p2); + LuaException::pcall (m_L, 2, 1); + return LuaRef (m_L, FromStack ()); + } + + template + LuaRef const operator() (P1 p1, P2 p2, P3 p3) const + { + push (m_L); + Stack ::push (m_L, p1); + Stack ::push (m_L, p2); + Stack ::push (m_L, p3); + LuaException::pcall (m_L, 3, 1); + return LuaRef (m_L, FromStack ()); + } + + template + LuaRef const operator() (P1 p1, P2 p2, P3 p3, P4 p4) const + { + push (m_L); + Stack ::push (m_L, p1); + Stack ::push (m_L, p2); + Stack ::push (m_L, p3); + Stack ::push (m_L, p4); + LuaException::pcall (m_L, 4, 1); + return LuaRef (m_L, FromStack ()); + } + + template + LuaRef const operator() (P1 p1, P2 p2, P3 p3, P4 p4, P5 p5) const + { + push (m_L); + Stack ::push (m_L, p1); + Stack ::push (m_L, p2); + Stack ::push (m_L, p3); + Stack ::push (m_L, p4); + Stack ::push (m_L, p5); + LuaException::pcall (m_L, 5, 1); + return LuaRef (m_L, FromStack ()); + } + + template + LuaRef const operator() (P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6) const + { + push (m_L); + Stack ::push (m_L, p1); + Stack ::push (m_L, p2); + Stack ::push (m_L, p3); + Stack ::push (m_L, p4); + Stack ::push (m_L, p5); + Stack ::push (m_L, p6); + LuaException::pcall (m_L, 6, 1); + return LuaRef (m_L, FromStack ()); + } + + template + LuaRef const operator() (P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6, P7 p7) const + { + push (m_L); + Stack ::push (m_L, p1); + Stack ::push (m_L, p2); + Stack ::push (m_L, p3); + Stack ::push (m_L, p4); + Stack ::push (m_L, p5); + Stack ::push (m_L, p6); + Stack ::push (m_L, p7); + LuaException::pcall (m_L, 7, 1); + return LuaRef (m_L, FromStack ()); + } + + template + LuaRef const operator() (P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6, P7 p7, P8 p8) const + { + push (m_L); + Stack ::push (m_L, p1); + Stack ::push (m_L, p2); + Stack ::push (m_L, p3); + Stack ::push (m_L, p4); + Stack ::push (m_L, p5); + Stack ::push (m_L, p6); + Stack ::push (m_L, p7); + Stack ::push (m_L, p8); + LuaException::pcall (m_L, 8, 1); + return LuaRef (m_L, FromStack ()); + } + /** @} */ + + //============================================================================ + +private: + lua_State* m_L; + int m_ref; +}; + +//------------------------------------------------------------------------------ +/** + Stack specialization for Nil +*/ +template <> +struct Stack +{ +public: + static inline void push (lua_State* L, Nil) + { + lua_pushnil (L); + } +}; + +//------------------------------------------------------------------------------ +/** + Stack specialization for LuaRef. +*/ +template <> +struct Stack +{ +public: + // The value is const& to prevent a copy construction. + // + static inline void push (lua_State* L, LuaRef const& v) + { + v.push (L); + } + + static inline LuaRef get (lua_State* L, int index) + { + return LuaRef (L, index, LuaRef::FromStack ()); + } +}; + +//------------------------------------------------------------------------------ +/** + Stack specialization for Proxy. +*/ +template <> +struct Stack +{ +public: + // The value is const& to prevent a copy construction. + // + static inline void push (lua_State* L, LuaRef::Proxy const& v) + { + v.push (L); + } +}; + +//------------------------------------------------------------------------------ +/** + Create a reference to a new, empty table. + + This is a syntactic abbreviation for LuaRef::newTable(). +*/ +inline LuaRef newTable (lua_State* L) +{ + return LuaRef::newTable (L); +} + +//------------------------------------------------------------------------------ +/** + Create a reference to a value in the global table. + + This is a syntactic abbreviation for LuaRef::getGlobal(). +*/ +inline LuaRef getGlobal (lua_State *L, char const* name) +{ + return LuaRef::getGlobal (L, name); +} + +//------------------------------------------------------------------------------ +/** + Write a LuaRef to a stream. + + This allows LuaRef and table proxies to work with streams. +*/ +inline std::ostream& operator<< (std::ostream& os, LuaRef const& ref) +{ + ref.print (os); + return os; +} + +//------------------------------------------------------------------------------ + +// more C++-like cast syntax +// +template +inline T LuaRef_cast(LuaRef const& lr) +{ + return lr.cast(); +} diff --git a/contrib/src/LuaBridge/detail/Namespace.h b/contrib/src/LuaBridge/detail/Namespace.h new file mode 100644 index 0000000..ff22e6b --- /dev/null +++ b/contrib/src/LuaBridge/detail/Namespace.h @@ -0,0 +1,1136 @@ +//------------------------------------------------------------------------------ +/* + https://github.com/vinniefalco/LuaBridge + + Copyright 2012, Vinnie Falco + Copyright 2007, Nathan Reed + + License: The MIT License (http://www.opensource.org/licenses/mit-license.php) + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ +//============================================================================== + +/** Provides C++ to Lua registration capabilities. + + This class is not instantiated directly, call `getGlobalNamespace` to start + the registration process. +*/ +class Namespace +{ +private: + Namespace& operator= (Namespace const& other); + + lua_State* const L; + int mutable m_stackSize; + +private: + //============================================================================ + /** + Error reporting. + + VF: This function looks handy, why aren't we using it? + */ +#if 0 + static int luaError (lua_State* L, std::string message) + { + assert (lua_isstring (L, lua_upvalueindex (1))); + std::string s; + + // Get information on the caller's caller to format the message, + // so the error appears to originate from the Lua source. + lua_Debug ar; + int result = lua_getstack (L, 2, &ar); + if (result != 0) + { + lua_getinfo (L, "Sl", &ar); + s = ar.short_src; + if (ar.currentline != -1) + { + // poor mans int to string to avoid . + lua_pushnumber (L, ar.currentline); + s = s + ":" + lua_tostring (L, -1) + ": "; + lua_pop (L, 1); + } + } + + s = s + message; + + return luaL_error (L, s.c_str ()); + } +#endif + + //---------------------------------------------------------------------------- + /** + Pop the Lua stack. + */ + void pop (int n) const + { + if (m_stackSize >= n && lua_gettop (L) >= n) + { + lua_pop (L, n); + m_stackSize -= n; + } + else + { + throw std::logic_error ("invalid stack"); + } + } + +private: + /** + Factored base to reduce template instantiations. + */ + class ClassBase + { + private: + ClassBase& operator= (ClassBase const& other); + + protected: + friend class Namespace; + + lua_State* const L; + int mutable m_stackSize; + + protected: + //-------------------------------------------------------------------------- + /** + __index metamethod for a class. + + This implements member functions, data members, and property members. + Functions are stored in the metatable and const metatable. Data members + and property members are in the __propget table. + + If the key is not found, the search proceeds up the hierarchy of base + classes. + */ + static int indexMetaMethod (lua_State* L) + { + int result = 0; + + assert (lua_isuserdata (L, 1)); // warn on security bypass + lua_getmetatable (L, 1); // get metatable for object + for (;;) + { + lua_pushvalue (L, 2); // push key arg2 + lua_rawget (L, -2); // lookup key in metatable + if (lua_iscfunction (L, -1)) // ensure its a cfunction + { + lua_remove (L, -2); // remove metatable + result = 1; + break; + } + else if (lua_isnil (L, -1)) + { + lua_pop (L, 1); + } + else + { + lua_pop (L, 2); + throw std::logic_error ("not a cfunction"); + } + + rawgetfield (L, -1, "__propget"); // get __propget table + if (lua_istable (L, -1)) // ensure it is a table + { + lua_pushvalue (L, 2); // push key arg2 + lua_rawget (L, -2); // lookup key in __propget + lua_remove (L, -2); // remove __propget + if (lua_iscfunction (L, -1)) // ensure its a cfunction + { + lua_remove (L, -2); // remove metatable + lua_pushvalue (L, 1); // push class arg1 + lua_call (L, 1, 1); + result = 1; + break; + } + else if (lua_isnil (L, -1)) + { + lua_pop (L, 1); + } + else + { + lua_pop (L, 2); + + // We only put cfunctions into __propget. + throw std::logic_error ("not a cfunction"); + } + } + else + { + lua_pop (L, 2); + + // __propget is missing, or not a table. + throw std::logic_error ("missing __propget table"); + } + + // Repeat the lookup in the __parent metafield, + // or return nil if the field doesn't exist. + rawgetfield (L, -1, "__parent"); + if (lua_istable (L, -1)) + { + // Remove metatable and repeat the search in __parent. + lua_remove (L, -2); + } + else if (lua_isnil (L, -1)) + { + result = 1; + break; + } + else + { + lua_pop (L, 2); + + throw std::logic_error ("__parent is not a table"); + } + } + + return result; + } + + //-------------------------------------------------------------------------- + /** + __newindex metamethod for classes. + + This supports writable variables and properties on class objects. The + corresponding object is passed in the first parameter to the set function. + */ + static int newindexMetaMethod (lua_State* L) + { + int result = 0; + + lua_getmetatable (L, 1); + + for (;;) + { + // Check __propset + rawgetfield (L, -1, "__propset"); + if (!lua_isnil (L, -1)) + { + lua_pushvalue (L, 2); + lua_rawget (L, -2); + if (!lua_isnil (L, -1)) + { + // found it, call the setFunction. + assert (lua_isfunction (L, -1)); + lua_pushvalue (L, 1); + lua_pushvalue (L, 3); + lua_call (L, 2, 0); + result = 0; + break; + } + lua_pop (L, 1); + } + lua_pop (L, 1); + + // Repeat the lookup in the __parent metafield. + rawgetfield (L, -1, "__parent"); + if (lua_isnil (L, -1)) + { + // Either the property or __parent must exist. + result = luaL_error (L, + "no member named '%s'", lua_tostring (L, 2)); + } + lua_remove (L, -2); + } + + return result; + } + + //-------------------------------------------------------------------------- + /** + Create the const table. + */ + void createConstTable (char const* name) + { + lua_newtable (L); + lua_pushvalue (L, -1); + lua_setmetatable (L, -2); + lua_pushboolean (L, 1); + lua_rawsetp (L, -2, getIdentityKey ()); + lua_pushstring (L, (std::string ("const ") + name).c_str ()); + rawsetfield (L, -2, "__type"); + lua_pushcfunction (L, &indexMetaMethod); + rawsetfield (L, -2, "__index"); + lua_pushcfunction (L, &newindexMetaMethod); + rawsetfield (L, -2, "__newindex"); + lua_newtable (L); + rawsetfield (L, -2, "__propget"); + + if (Security::hideMetatables ()) + { + lua_pushnil (L); + rawsetfield (L, -2, "__metatable"); + } + } + + //-------------------------------------------------------------------------- + /** + Create the class table. + + The Lua stack should have the const table on top. + */ + void createClassTable (char const* name) + { + lua_newtable (L); + lua_pushvalue (L, -1); + lua_setmetatable (L, -2); + lua_pushboolean (L, 1); + lua_rawsetp (L, -2, getIdentityKey ()); + lua_pushstring (L, name); + rawsetfield (L, -2, "__type"); + lua_pushcfunction (L, &indexMetaMethod); + rawsetfield (L, -2, "__index"); + lua_pushcfunction (L, &newindexMetaMethod); + rawsetfield (L, -2, "__newindex"); + lua_newtable (L); + rawsetfield (L, -2, "__propget"); + lua_newtable (L); + rawsetfield (L, -2, "__propset"); + + lua_pushvalue (L, -2); + rawsetfield (L, -2, "__const"); // point to const table + + lua_pushvalue (L, -1); + rawsetfield (L, -3, "__class"); // point const table to class table + + if (Security::hideMetatables ()) + { + lua_pushnil (L); + rawsetfield (L, -2, "__metatable"); + } + } + + //-------------------------------------------------------------------------- + /** + Create the static table. + + The Lua stack should have: + -1 class table + -2 const table + -3 enclosing namespace + */ + void createStaticTable (char const* name) + { + lua_newtable (L); + lua_newtable (L); + lua_pushvalue (L, -1); + lua_setmetatable (L, -3); + lua_insert (L, -2); + rawsetfield (L, -5, name); + +#if 0 + lua_pushlightuserdata (L, this); + lua_pushcclosure (L, &tostringMetaMethod, 1); + rawsetfield (L, -2, "__tostring"); +#endif + lua_pushcfunction (L, &CFunc::indexMetaMethod); + rawsetfield (L, -2, "__index"); + lua_pushcfunction (L, &CFunc::newindexMetaMethod); + rawsetfield (L, -2, "__newindex"); + lua_newtable (L); + rawsetfield (L, -2, "__propget"); + lua_newtable (L); + rawsetfield (L, -2, "__propset"); + + lua_pushvalue (L, -2); + rawsetfield (L, -2, "__class"); // point to class table + + if (Security::hideMetatables ()) + { + lua_pushnil (L); + rawsetfield (L, -2, "__metatable"); + } + } + + //========================================================================== + /** + lua_CFunction to construct a class object wrapped in a container. + */ + template + static int ctorContainerProxy (lua_State* L) + { + typedef typename ContainerTraits ::Type T; + ArgList args (L); + T* const p = Constructor ::call (args); + UserdataSharedHelper ::push (L, p); + return 1; + } + + //-------------------------------------------------------------------------- + /** + lua_CFunction to construct a class object in-place in the userdata. + */ + template + static int ctorPlacementProxy (lua_State* L) + { + ArgList args (L); + Constructor ::call (UserdataValue ::place (L), args); + return 1; + } + + //-------------------------------------------------------------------------- + /** + Pop the Lua stack. + */ + void pop (int n) const + { + if (m_stackSize >= n && lua_gettop (L) >= n) + { + lua_pop (L, n); + m_stackSize -= n; + } + else + { + throw std::logic_error ("invalid stack"); + } + } + + public: + //-------------------------------------------------------------------------- + explicit ClassBase (lua_State* L_) + : L (L_) + , m_stackSize (0) + { + } + + //-------------------------------------------------------------------------- + /** + Copy Constructor. + */ + ClassBase (ClassBase const& other) + : L (other.L) + , m_stackSize (0) + { + m_stackSize = other.m_stackSize; + other.m_stackSize = 0; + } + + ~ClassBase () + { + pop (m_stackSize); + } + }; + + //============================================================================ + // + // Class + // + //============================================================================ + /** + Provides a class registration in a lua_State. + + After contstruction the Lua stack holds these objects: + -1 static table + -2 class table + -3 const table + -4 (enclosing namespace) + */ + template + class Class : public ClassBase + { + public: + //========================================================================== + /** + Register a new class or add to an existing class registration. + */ + Class (char const* name, Namespace const* parent) : ClassBase (parent->L) + { + m_stackSize = parent->m_stackSize + 3; + parent->m_stackSize = 0; + + assert (lua_istable (L, -1)); + rawgetfield (L, -1, name); + + if (lua_isnil (L, -1)) + { + lua_pop (L, 1); + + createConstTable (name); + lua_pushcfunction (L, &CFunc::gcMetaMethod ); + rawsetfield (L, -2, "__gc"); + + createClassTable (name); + lua_pushcfunction (L, &CFunc::gcMetaMethod ); + rawsetfield (L, -2, "__gc"); + + createStaticTable (name); + + // Map T back to its tables. + lua_pushvalue (L, -1); + lua_rawsetp (L, LUA_REGISTRYINDEX, ClassInfo ::getStaticKey ()); + lua_pushvalue (L, -2); + lua_rawsetp (L, LUA_REGISTRYINDEX, ClassInfo ::getClassKey ()); + lua_pushvalue (L, -3); + lua_rawsetp (L, LUA_REGISTRYINDEX, ClassInfo ::getConstKey ()); + } + else + { + rawgetfield (L, -1, "__class"); + rawgetfield (L, -1, "__const"); + + // Reverse the top 3 stack elements + lua_insert (L, -3); + lua_insert (L, -2); + } + } + + //========================================================================== + /** + Derive a new class. + */ + Class (char const* name, Namespace const* parent, void const* const staticKey) + : ClassBase (parent->L) + { + m_stackSize = parent->m_stackSize + 3; + parent->m_stackSize = 0; + + assert (lua_istable (L, -1)); + + createConstTable (name); + lua_pushcfunction (L, &CFunc::gcMetaMethod ); + rawsetfield (L, -2, "__gc"); + + createClassTable (name); + lua_pushcfunction (L, &CFunc::gcMetaMethod ); + rawsetfield (L, -2, "__gc"); + + createStaticTable (name); + + lua_rawgetp (L, LUA_REGISTRYINDEX, staticKey); + assert (lua_istable (L, -1)); + rawgetfield (L, -1, "__class"); + assert (lua_istable (L, -1)); + rawgetfield (L, -1, "__const"); + assert (lua_istable (L, -1)); + + rawsetfield (L, -6, "__parent"); + rawsetfield (L, -4, "__parent"); + rawsetfield (L, -2, "__parent"); + + lua_pushvalue (L, -1); + lua_rawsetp (L, LUA_REGISTRYINDEX, ClassInfo ::getStaticKey ()); + lua_pushvalue (L, -2); + lua_rawsetp (L, LUA_REGISTRYINDEX, ClassInfo ::getClassKey ()); + lua_pushvalue (L, -3); + lua_rawsetp (L, LUA_REGISTRYINDEX, ClassInfo ::getConstKey ()); + } + + //-------------------------------------------------------------------------- + /** + Continue registration in the enclosing namespace. + */ + Namespace endClass () + { + return Namespace (this); + } + + //-------------------------------------------------------------------------- + /** + Add or replace a static data member. + */ + template + Class & addStaticData (char const* name, U* pu, bool isWritable = true) + { + assert (lua_istable (L, -1)); + + rawgetfield (L, -1, "__propget"); + assert (lua_istable (L, -1)); + lua_pushlightuserdata (L, pu); + lua_pushcclosure (L, &CFunc::getVariable , 1); + rawsetfield (L, -2, name); + lua_pop (L, 1); + + rawgetfield (L, -1, "__propset"); + assert (lua_istable (L, -1)); + if (isWritable) + { + lua_pushlightuserdata (L, pu); + lua_pushcclosure (L, &CFunc::setVariable , 1); + } + else + { + lua_pushstring (L, name); + lua_pushcclosure (L, &CFunc::readOnlyError, 1); + } + rawsetfield (L, -2, name); + lua_pop (L, 1); + + return *this; + } + + //-------------------------------------------------------------------------- + /** + Add or replace a static property member. + + If the set function is null, the property is read-only. + */ + template + Class & addStaticProperty (char const* name, U (*get)(), void (*set)(U) = 0) + { + typedef U (*get_t)(); + typedef void (*set_t)(U); + + assert (lua_istable (L, -1)); + + rawgetfield (L, -1, "__propget"); + assert (lua_istable (L, -1)); + new (lua_newuserdata (L, sizeof (get))) get_t (get); + lua_pushcclosure (L, &CFunc::Call ::f, 1); + rawsetfield (L, -2, name); + lua_pop (L, 1); + + rawgetfield (L, -1, "__propset"); + assert (lua_istable (L, -1)); + if (set != 0) + { + new (lua_newuserdata (L, sizeof (set))) set_t (set); + lua_pushcclosure (L, &CFunc::Call ::f, 1); + } + else + { + lua_pushstring (L, name); + lua_pushcclosure (L, &CFunc::readOnlyError, 1); + } + rawsetfield (L, -2, name); + lua_pop (L, 1); + + return *this; + } + + //-------------------------------------------------------------------------- + /** + Add or replace a static member function. + */ + template + Class & addStaticFunction (char const* name, FP const fp) + { + new (lua_newuserdata (L, sizeof (fp))) FP (fp); + lua_pushcclosure (L, &CFunc::Call ::f, 1); + rawsetfield (L, -2, name); + + return *this; + } + + //-------------------------------------------------------------------------- + /** + Add or replace a lua_CFunction. + */ + Class & addStaticCFunction (char const* name, int (*const fp)(lua_State*)) + { + lua_pushcfunction (L, fp); + rawsetfield (L, -2, name); + return *this; + } + + //-------------------------------------------------------------------------- + /** + Add or replace a data member. + */ + template + Class & addData (char const* name, const U T::* mp, bool isWritable = true) + { + typedef const U T::*mp_t; + + // Add to __propget in class and const tables. + { + rawgetfield (L, -2, "__propget"); + rawgetfield (L, -4, "__propget"); + new (lua_newuserdata (L, sizeof (mp_t))) mp_t (mp); + lua_pushcclosure (L, &CFunc::getProperty , 1); + lua_pushvalue (L, -1); + rawsetfield (L, -4, name); + rawsetfield (L, -2, name); + lua_pop (L, 2); + } + + if (isWritable) + { + // Add to __propset in class table. + rawgetfield (L, -2, "__propset"); + assert (lua_istable (L, -1)); + new (lua_newuserdata (L, sizeof (mp_t))) mp_t (mp); + lua_pushcclosure (L, &CFunc::setProperty , 1); + rawsetfield (L, -2, name); + lua_pop (L, 1); + } + + return *this; + } + + //-------------------------------------------------------------------------- + /** + Add or replace a property member. + */ + template + Class & addProperty (char const* name, TG (T::* get) () const, void (T::* set) (TS)) + { + // Add to __propget in class and const tables. + { + rawgetfield (L, -2, "__propget"); + rawgetfield (L, -4, "__propget"); + typedef TG (T::*get_t) () const; + new (lua_newuserdata (L, sizeof (get_t))) get_t (get); + lua_pushcclosure (L, &CFunc::CallConstMember ::f, 1); + lua_pushvalue (L, -1); + rawsetfield (L, -4, name); + rawsetfield (L, -2, name); + lua_pop (L, 2); + } + + { + // Add to __propset in class table. + rawgetfield (L, -2, "__propset"); + assert (lua_istable (L, -1)); + typedef void (T::* set_t) (TS); + new (lua_newuserdata (L, sizeof (set_t))) set_t (set); + lua_pushcclosure (L, &CFunc::CallMember ::f, 1); + rawsetfield (L, -2, name); + lua_pop (L, 1); + } + + return *this; + } + + // read-only + template + Class & addProperty (char const* name, TG (T::* get) () const) + { + // Add to __propget in class and const tables. + rawgetfield (L, -2, "__propget"); + rawgetfield (L, -4, "__propget"); + typedef TG (T::*get_t) () const; + new (lua_newuserdata (L, sizeof (get_t))) get_t (get); + lua_pushcclosure (L, &CFunc::CallConstMember ::f, 1); + lua_pushvalue (L, -1); + rawsetfield (L, -4, name); + rawsetfield (L, -2, name); + lua_pop (L, 2); + + return *this; + } + + //-------------------------------------------------------------------------- + /** + Add or replace a property member, by proxy. + + When a class is closed for modification and does not provide (or cannot + provide) the function signatures necessary to implement get or set for + a property, this will allow non-member functions act as proxies. + + Both the get and the set functions require a T const* and T* in the first + argument respectively. + */ + template + Class & addProperty (char const* name, TG (*get) (T const*), void (*set) (T*, TS)) + { + // Add to __propget in class and const tables. + { + rawgetfield (L, -2, "__propget"); + rawgetfield (L, -4, "__propget"); + typedef TG (*get_t) (T const*); + new (lua_newuserdata (L, sizeof (get_t))) get_t (get); + lua_pushcclosure (L, &CFunc::Call ::f, 1); + lua_pushvalue (L, -1); + rawsetfield (L, -4, name); + rawsetfield (L, -2, name); + lua_pop (L, 2); + } + + if (set != 0) + { + // Add to __propset in class table. + rawgetfield (L, -2, "__propset"); + assert (lua_istable (L, -1)); + typedef void (*set_t) (T*, TS); + new (lua_newuserdata (L, sizeof (set_t))) set_t (set); + lua_pushcclosure (L, &CFunc::Call ::f, 1); + rawsetfield (L, -2, name); + lua_pop (L, 1); + } + + return *this; + } + + // read-only + template + Class & addProperty (char const* name, TG (*get) (T const*)) + { + // Add to __propget in class and const tables. + rawgetfield (L, -2, "__propget"); + rawgetfield (L, -4, "__propget"); + typedef TG (*get_t) (T const*); + new (lua_newuserdata (L, sizeof (get_t))) get_t (get); + lua_pushcclosure (L, &CFunc::Call ::f, 1); + lua_pushvalue (L, -1); + rawsetfield (L, -4, name); + rawsetfield (L, -2, name); + lua_pop (L, 2); + + return *this; + } + + //-------------------------------------------------------------------------- + /** + Add or replace a member function. + */ + template + Class & addFunction (char const* name, MemFn mf) + { + CFunc::CallMemberFunctionHelper ::isConstMemberFunction>::add (L, name, mf); + return *this; + } + + //-------------------------------------------------------------------------- + /** + Add or replace a member lua_CFunction. + */ + Class & addCFunction (char const* name, int (T::*mfp)(lua_State*)) + { + typedef int (T::*MFP)(lua_State*); + assert (lua_istable (L, -1)); + new (lua_newuserdata (L, sizeof (mfp))) MFP (mfp); + lua_pushcclosure (L, &CFunc::CallMemberCFunction ::f, 1); + rawsetfield (L, -3, name); // class table + + return *this; + } + + //-------------------------------------------------------------------------- + /** + Add or replace a const member lua_CFunction. + */ + Class & addCFunction (char const* name, int (T::*mfp)(lua_State*) const) + { + typedef int (T::*MFP)(lua_State*) const; + assert (lua_istable (L, -1)); + new (lua_newuserdata (L, sizeof (mfp))) MFP (mfp); + lua_pushcclosure (L, &CFunc::CallConstMemberCFunction ::f, 1); + lua_pushvalue (L, -1); + rawsetfield (L, -5, name); // const table + rawsetfield (L, -3, name); // class table + + return *this; + } + + //-------------------------------------------------------------------------- + /** + Add or replace a primary Constructor. + + The primary Constructor is invoked when calling the class type table + like a function. + + The template parameter should be a function pointer type that matches + the desired Constructor (since you can't take the address of a Constructor + and pass it as an argument). + */ + template + Class & addConstructor () + { + lua_pushcclosure (L, + &ctorContainerProxy ::Params, C>, 0); + rawsetfield(L, -2, "__call"); + + return *this; + } + + template + Class & addConstructor () + { + lua_pushcclosure (L, + &ctorPlacementProxy ::Params, T>, 0); + rawsetfield(L, -2, "__call"); + + return *this; + } + }; + +private: + //---------------------------------------------------------------------------- + /** + Open the global namespace for registrations. + */ + explicit Namespace (lua_State* L_) + : L (L_) + , m_stackSize (0) + { + lua_getglobal (L, "_G"); + ++m_stackSize; + } + + //---------------------------------------------------------------------------- + /** + Open a namespace for registrations. + + The namespace is created if it doesn't already exist. + The parent namespace is at the top of the Lua stack. + */ + Namespace (char const* name, Namespace const* parent) + : L (parent->L) + , m_stackSize (0) + { + m_stackSize = parent->m_stackSize + 1; + parent->m_stackSize = 0; + + assert (lua_istable (L, -1)); + rawgetfield (L, -1, name); + if (lua_isnil (L, -1)) + { + lua_pop (L, 1); + + lua_newtable (L); + lua_pushvalue (L, -1); + lua_setmetatable (L, -2); + lua_pushcfunction (L, &CFunc::indexMetaMethod); + rawsetfield (L, -2, "__index"); + lua_pushcfunction (L, &CFunc::newindexMetaMethod); + rawsetfield (L, -2, "__newindex"); + lua_newtable (L); + rawsetfield (L, -2, "__propget"); + lua_newtable (L); + rawsetfield (L, -2, "__propset"); + lua_pushvalue (L, -1); + rawsetfield (L, -3, name); +#if 0 + lua_pushcfunction (L, &tostringMetaMethod); + rawsetfield (L, -2, "__tostring"); +#endif + } + } + + //---------------------------------------------------------------------------- + /** + Creates a continued registration from a child namespace. + */ + explicit Namespace (Namespace const* child) + : L (child->L) + , m_stackSize (0) + { + m_stackSize = child->m_stackSize - 1; + child->m_stackSize = 1; + child->pop (1); + + // It is not necessary or valid to call + // endNamespace() for the global namespace! + // + assert (m_stackSize != 0); + } + + //---------------------------------------------------------------------------- + /** + Creates a continued registration from a child class. + */ + explicit Namespace (ClassBase const* child) + : L (child->L) + , m_stackSize (0) + { + m_stackSize = child->m_stackSize - 3; + child->m_stackSize = 3; + child->pop (3); + } + +public: + //---------------------------------------------------------------------------- + /** + Copy Constructor. + + Ownership of the stack is transferred to the new object. This happens + when the compiler emits temporaries to hold these objects while chaining + registrations across namespaces. + */ + Namespace (Namespace const& other) : L (other.L) + { + m_stackSize = other.m_stackSize; + other.m_stackSize = 0; + } + + //---------------------------------------------------------------------------- + /** + Closes this namespace registration. + */ + ~Namespace () + { + pop (m_stackSize); + } + + //---------------------------------------------------------------------------- + /** + Open the global namespace. + */ + static Namespace getGlobalNamespace (lua_State* L) + { + return Namespace (L); + } + + //---------------------------------------------------------------------------- + /** + Open a new or existing namespace for registrations. + */ + Namespace beginNamespace (char const* name) + { + return Namespace (name, this); + } + + //---------------------------------------------------------------------------- + /** + Continue namespace registration in the parent. + + Do not use this on the global namespace. + */ + Namespace endNamespace () + { + return Namespace (this); + } + + //---------------------------------------------------------------------------- + /** + Add or replace a variable. + */ + template + Namespace& addVariable (char const* name, T* pt, bool isWritable = true) + { + assert (lua_istable (L, -1)); + + rawgetfield (L, -1, "__propget"); + assert (lua_istable (L, -1)); + lua_pushlightuserdata (L, pt); + lua_pushcclosure (L, &CFunc::getVariable , 1); + rawsetfield (L, -2, name); + lua_pop (L, 1); + + rawgetfield (L, -1, "__propset"); + assert (lua_istable (L, -1)); + if (isWritable) + { + lua_pushlightuserdata (L, pt); + lua_pushcclosure (L, &CFunc::setVariable , 1); + } + else + { + lua_pushstring (L, name); + lua_pushcclosure (L, &CFunc::readOnlyError, 1); + } + rawsetfield (L, -2, name); + lua_pop (L, 1); + + return *this; + } + + //---------------------------------------------------------------------------- + /** + Add or replace a property. + + If the set function is omitted or null, the property is read-only. + */ + template + Namespace& addProperty (char const* name, TG (*get) (), void (*set)(TS) = 0) + { + assert (lua_istable (L, -1)); + + rawgetfield (L, -1, "__propget"); + assert (lua_istable (L, -1)); + typedef TG (*get_t) (); + new (lua_newuserdata (L, sizeof (get_t))) get_t (get); + lua_pushcclosure (L, &CFunc::Call ::f, 1); + rawsetfield (L, -2, name); + lua_pop (L, 1); + + rawgetfield (L, -1, "__propset"); + assert (lua_istable (L, -1)); + if (set != 0) + { + typedef void (*set_t) (TS); + new (lua_newuserdata (L, sizeof (set_t))) set_t (set); + lua_pushcclosure (L, &CFunc::Call ::f, 1); + } + else + { + lua_pushstring (L, name); + lua_pushcclosure (L, &CFunc::readOnlyError, 1); + } + rawsetfield (L, -2, name); + lua_pop (L, 1); + + return *this; + } + + //---------------------------------------------------------------------------- + /** + Add or replace a free function. + */ + template + Namespace& addFunction (char const* name, FP const fp) + { + assert (lua_istable (L, -1)); + + new (lua_newuserdata (L, sizeof (fp))) FP (fp); + lua_pushcclosure (L, &CFunc::Call ::f, 1); + rawsetfield (L, -2, name); + + return *this; + } + + //---------------------------------------------------------------------------- + /** + Add or replace a lua_CFunction. + */ + Namespace& addCFunction (char const* name, int (*const fp)(lua_State*)) + { + lua_pushcfunction (L, fp); + rawsetfield (L, -2, name); + + return *this; + } + + //---------------------------------------------------------------------------- + /** + Open a new or existing class for registrations. + */ + template + Class beginClass (char const* name) + { + return Class (name, this); + } + + //---------------------------------------------------------------------------- + /** + Derive a new class for registrations. + + To continue registrations for the class later, use beginClass(). + Do not call deriveClass() again. + */ + template + Class deriveClass (char const* name) + { + return Class (name, this, ClassInfo ::getStaticKey ()); + } +}; + +//------------------------------------------------------------------------------ +/** + Retrieve the global namespace. + + It is recommended to put your namespace inside the global namespace, and + then add your classes and functions to it, rather than adding many classes + and functions directly to the global namespace. +*/ +inline Namespace getGlobalNamespace (lua_State* L) +{ + return Namespace::getGlobalNamespace (L); +} diff --git a/contrib/src/LuaBridge/detail/Stack.h b/contrib/src/LuaBridge/detail/Stack.h new file mode 100644 index 0000000..d10fa8a --- /dev/null +++ b/contrib/src/LuaBridge/detail/Stack.h @@ -0,0 +1,469 @@ +//------------------------------------------------------------------------------ +/* + https://github.com/vinniefalco/LuaBridge + + Copyright 2012, Vinnie Falco + Copyright 2007, Nathan Reed + + License: The MIT License (http://www.opensource.org/licenses/mit-license.php) + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ +//============================================================================== + +//------------------------------------------------------------------------------ +/** + Receive the lua_State* as an argument. +*/ +template <> +struct Stack +{ + static lua_State* get (lua_State* L, int) + { + return L; + } +}; + +//------------------------------------------------------------------------------ +/** + Push a lua_CFunction. +*/ +template <> +struct Stack +{ + static void push (lua_State* L, lua_CFunction f) + { + lua_pushcfunction (L, f); + } + + static lua_CFunction get (lua_State* L, int index) + { + return lua_tocfunction (L, index); + } +}; + +//------------------------------------------------------------------------------ +/** + Stack specialization for `int`. +*/ +template <> +struct Stack +{ + static inline void push (lua_State* L, int value) + { + lua_pushinteger (L, static_cast (value)); + } + + static inline int get (lua_State* L, int index) + { + return static_cast (luaL_checkinteger (L, index)); + } +}; + +template <> +struct Stack +{ + static inline void push (lua_State* L, int value) + { + lua_pushnumber (L, static_cast (value)); + } + + static inline int get (lua_State* L, int index) + { + return static_cast (luaL_checknumber (L, index)); + } +}; +//------------------------------------------------------------------------------ +/** + Stack specialization for `unsigned int`. +*/ +template <> +struct Stack +{ + static inline void push (lua_State* L, unsigned int value) + { + lua_pushinteger (L, static_cast (value)); + } + + static inline unsigned int get (lua_State* L, int index) + { + return static_cast (luaL_checkinteger (L, index)); + } +}; + +template <> +struct Stack +{ + static inline void push (lua_State* L, unsigned int value) + { + lua_pushnumber (L, static_cast (value)); + } + + static inline unsigned int get (lua_State* L, int index) + { + return static_cast (luaL_checknumber (L, index)); + } +}; + +//------------------------------------------------------------------------------ +/** + Stack specialization for `unsigned char`. +*/ +template <> +struct Stack +{ + static inline void push (lua_State* L, unsigned char value) + { + lua_pushinteger (L, static_cast (value)); + } + + static inline unsigned char get (lua_State* L, int index) + { + return static_cast (luaL_checkinteger (L, index)); + } +}; + +template <> +struct Stack +{ + static inline void push (lua_State* L, unsigned char value) + { + lua_pushnumber (L, static_cast (value)); + } + + static inline unsigned char get (lua_State* L, int index) + { + return static_cast (luaL_checknumber (L, index)); + } +}; + +//------------------------------------------------------------------------------ +/** + Stack specialization for `short`. +*/ +template <> +struct Stack +{ + static inline void push (lua_State* L, short value) + { + lua_pushinteger (L, static_cast (value)); + } + + static inline short get (lua_State* L, int index) + { + return static_cast (luaL_checkinteger (L, index)); + } +}; + +template <> +struct Stack +{ + static inline void push (lua_State* L, short value) + { + lua_pushnumber (L, static_cast (value)); + } + + static inline short get (lua_State* L, int index) + { + return static_cast (luaL_checknumber (L, index)); + } +}; + +//------------------------------------------------------------------------------ +/** + Stack specialization for `unsigned short`. +*/ +template <> +struct Stack +{ + static inline void push (lua_State* L, unsigned short value) + { + lua_pushinteger (L, static_cast (value)); + } + + static inline unsigned short get (lua_State* L, int index) + { + return static_cast (luaL_checkinteger (L, index)); + } +}; + +template <> +struct Stack +{ + static inline void push (lua_State* L, unsigned short value) + { + lua_pushnumber (L, static_cast (value)); + } + + static inline unsigned short get (lua_State* L, int index) + { + return static_cast (luaL_checknumber (L, index)); + } +}; + +//------------------------------------------------------------------------------ +/** + Stack specialization for `long`. +*/ +template <> +struct Stack +{ + static inline void push (lua_State* L, long value) + { + lua_pushinteger (L, static_cast (value)); + } + + static inline long get (lua_State* L, int index) + { + return static_cast (luaL_checkinteger (L, index)); + } +}; + +template <> +struct Stack +{ + static inline void push (lua_State* L, long value) + { + lua_pushnumber (L, static_cast (value)); + } + + static inline long get (lua_State* L, int index) + { + return static_cast (luaL_checknumber (L, index)); + } +}; + +//------------------------------------------------------------------------------ +/** + Stack specialization for `unsigned long`. +*/ +template <> +struct Stack +{ + static inline void push (lua_State* L, unsigned long value) + { + lua_pushinteger (L, static_cast (value)); + } + + static inline unsigned long get (lua_State* L, int index) + { + return static_cast (luaL_checkinteger (L, index)); + } +}; + +template <> +struct Stack +{ + static inline void push (lua_State* L, unsigned long value) + { + lua_pushnumber (L, static_cast (value)); + } + + static inline unsigned long get (lua_State* L, int index) + { + return static_cast (luaL_checknumber (L, index)); + } +}; + +//------------------------------------------------------------------------------ +/** + Stack specialization for `float`. +*/ +template <> +struct Stack +{ + static inline void push (lua_State* L, float value) + { + lua_pushnumber (L, static_cast (value)); + } + + static inline float get (lua_State* L, int index) + { + return static_cast (luaL_checknumber (L, index)); + } +}; + +template <> +struct Stack +{ + static inline void push (lua_State* L, float value) + { + lua_pushnumber (L, static_cast (value)); + } + + static inline float get (lua_State* L, int index) + { + return static_cast (luaL_checknumber (L, index)); + } +}; + +//------------------------------------------------------------------------------ +/** + Stack specialization for `double`. +*/ +template <> struct Stack +{ + static inline void push (lua_State* L, double value) + { + lua_pushnumber (L, static_cast (value)); + } + + static inline double get (lua_State* L, int index) + { + return static_cast (luaL_checknumber (L, index)); + } +}; + +template <> struct Stack +{ + static inline void push (lua_State* L, double value) + { + lua_pushnumber (L, static_cast (value)); + } + + static inline double get (lua_State* L, int index) + { + return static_cast (luaL_checknumber (L, index)); + } +}; + +//------------------------------------------------------------------------------ +/** + Stack specialization for `bool`. +*/ +template <> +struct Stack { + static inline void push (lua_State* L, bool value) + { + lua_pushboolean (L, value ? 1 : 0); + } + + static inline bool get (lua_State* L, int index) + { + return lua_toboolean (L, index) ? true : false; + } +}; + +template <> +struct Stack { + static inline void push (lua_State* L, bool value) + { + lua_pushboolean (L, value ? 1 : 0); + } + + static inline bool get (lua_State* L, int index) + { + return lua_toboolean (L, index) ? true : false; + } +}; + +//------------------------------------------------------------------------------ +/** + Stack specialization for `char`. +*/ +template <> +struct Stack +{ + static inline void push (lua_State* L, char value) + { + char str [2] = { value, 0 }; + lua_pushstring (L, str); + } + + static inline char get (lua_State* L, int index) + { + return luaL_checkstring (L, index) [0]; + } +}; + +template <> +struct Stack +{ + static inline void push (lua_State* L, char value) + { + char str [2] = { value, 0 }; + lua_pushstring (L, str); + } + + static inline char get (lua_State* L, int index) + { + return luaL_checkstring (L, index) [0]; + } +}; + +//------------------------------------------------------------------------------ +/** + Stack specialization for `float`. +*/ +template <> +struct Stack +{ + static inline void push (lua_State* L, char const* str) + { + if (str != 0) + lua_pushstring (L, str); + else + lua_pushnil (L); + } + + static inline char const* get (lua_State* L, int index) + { + return lua_isnil (L, index) ? 0 : luaL_checkstring (L, index); + } +}; + +//------------------------------------------------------------------------------ +/** + Stack specialization for `std::string`. +*/ +template <> +struct Stack +{ + static inline void push (lua_State* L, std::string const& str) + { + lua_pushlstring (L, str.c_str (), str.size()); + } + + static inline std::string get (lua_State* L, int index) + { + size_t len; + const char *str = luaL_checklstring(L, index, &len); + return std::string (str, len); + } +}; + +//------------------------------------------------------------------------------ +/** + Stack specialization for `std::string const&`. +*/ +template <> +struct Stack +{ + static inline void push (lua_State* L, std::string const& str) + { + lua_pushlstring (L, str.c_str(), str.size()); + } + + static inline std::string get (lua_State* L, int index) + { + size_t len; + const char *str = luaL_checklstring(L, index, &len); + return std::string (str, len); + } +}; diff --git a/contrib/src/LuaBridge/detail/TypeList.h b/contrib/src/LuaBridge/detail/TypeList.h new file mode 100644 index 0000000..21f850e --- /dev/null +++ b/contrib/src/LuaBridge/detail/TypeList.h @@ -0,0 +1,174 @@ +//------------------------------------------------------------------------------ +/* + https://github.com/vinniefalco/LuaBridge + + Copyright 2012, Vinnie Falco + Copyright 2007, Nathan Reed + + License: The MIT License (http://www.opensource.org/licenses/mit-license.php) + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. + + This file incorporates work covered by the following copyright and + permission notice: + + The Loki Library + Copyright (c) 2001 by Andrei Alexandrescu + This code accompanies the book: + Alexandrescu, Andrei. "Modern C++ Design: Generic Programming and Design + Patterns Applied". Copyright (c) 2001. Addison-Wesley. + Permission to use, copy, modify, distribute and sell this software for any + purpose is hereby granted without fee, provided that the above copyright + notice appear in all copies and that both that copyright notice and this + permission notice appear in supporting documentation. + The author or Addison-Welsey Longman make no representations about the + suitability of this software for any purpose. It is provided "as is" + without express or implied warranty. +*/ +//============================================================================== + +/** + None type means void parameters or return value. +*/ +typedef void None; + +template +struct TypeList +{ +}; + +/** + A TypeList with actual values. +*/ +template +struct TypeListValues +{ + static std::string const tostring (bool) + { + return ""; + } +}; + +/** + TypeListValues recursive template definition. +*/ +template +struct TypeListValues > +{ + Head hd; + TypeListValues tl; + + TypeListValues (Head hd_, TypeListValues const& tl_) + : hd (hd_), tl (tl_) + { + } + + static std::string const tostring (bool comma = false) + { + std::string s; + + if (comma) + s = ", "; + + s = s + typeid (Head).name (); + + return s + TypeListValues ::tostring (true); + } +}; + +// Specializations of type/value list for head types that are references and +// const-references. We need to handle these specially since we can't count +// on the referenced object hanging around for the lifetime of the list. + +template +struct TypeListValues > +{ + Head hd; + TypeListValues tl; + + TypeListValues (Head& hd_, TypeListValues const& tl_) + : hd (hd_), tl (tl_) + { + } + + static std::string const tostring (bool comma = false) + { + std::string s; + + if (comma) + s = ", "; + + s = s + typeid (Head).name () + "&"; + + return s + TypeListValues ::tostring (true); + } +}; + +template +struct TypeListValues > +{ + Head hd; + TypeListValues tl; + + TypeListValues (Head const& hd_, const TypeListValues & tl_) + : hd (hd_), tl (tl_) + { + } + + static std::string const tostring (bool comma = false) + { + std::string s; + + if (comma) + s = ", "; + + s = s + typeid (Head).name () + " const&"; + + return s + TypeListValues ::tostring (true); + } +}; + +//============================================================================== +/** + Subclass of a TypeListValues constructable from the Lua stack. +*/ + +template +struct ArgList +{ +}; + +template +struct ArgList : public TypeListValues +{ + ArgList (lua_State*) + { + } +}; + +template +struct ArgList , Start> + : public TypeListValues > +{ + ArgList (lua_State* L) + : TypeListValues > (Stack ::get (L, Start), + ArgList (L)) + { + } +}; diff --git a/contrib/src/LuaBridge/detail/TypeTraits.h b/contrib/src/LuaBridge/detail/TypeTraits.h new file mode 100644 index 0000000..5dd0771 --- /dev/null +++ b/contrib/src/LuaBridge/detail/TypeTraits.h @@ -0,0 +1,125 @@ +//------------------------------------------------------------------------------ +/* + https://github.com/vinniefalco/LuaBridge + + Copyright 2012, Vinnie Falco + + License: The MIT License (http://www.opensource.org/licenses/mit-license.php) + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ +//============================================================================== + +#ifndef LUABRIDGE_TYPEINFO_HEADER +#define LUABRIDGE_TYPEINFO_HEADER + +//------------------------------------------------------------------------------ +/** + Container traits. + + Unspecialized ContainerTraits has the isNotContainer typedef for SFINAE. + All user defined containers must supply an appropriate specialization for + ContinerTraits (without the typedef isNotContainer). The containers that + come with LuaBridge also come with the appropriate ContainerTraits + specialization. See the corresponding declaration for details. + + A specialization of ContainerTraits for some generic type ContainerType + looks like this: + + template + struct ContainerTraits > + { + typedef typename T Type; + + static T* get (ContainerType const& c) + { + return c.get (); // Implementation-dependent on ContainerType + } + }; +*/ +template +struct ContainerTraits +{ + typedef bool isNotContainer; +}; + +//------------------------------------------------------------------------------ +/** + Type traits. + + Specializations return information about a type. +*/ +struct TypeTraits +{ + /** Determine if type T is a container. + + To be considered a container, there must be a specialization of + ContainerTraits with the required fields. + */ + template + class isContainer + { + private: + typedef char yes[1]; // sizeof (yes) == 1 + typedef char no [2]; // sizeof (no) == 2 + + template + static no& test (typename C::isNotContainer*); + + template + static yes& test (...); + + public: + static const bool value = sizeof (test >(0)) == sizeof (yes); + }; + + /** Determine if T is const qualified. + */ + /** @{ */ + template + struct isConst + { + static bool const value = false; + }; + + template + struct isConst + { + static bool const value = true; + }; + /** @} */ + + /** Remove the const qualifier from T. + */ + /** @{ */ + template + struct removeConst + { + typedef T Type; + }; + + template + struct removeConst + { + typedef T Type; + }; + /**@}*/ +}; + +#endif diff --git a/contrib/src/LuaBridge/detail/Userdata.h b/contrib/src/LuaBridge/detail/Userdata.h new file mode 100644 index 0000000..19451bd --- /dev/null +++ b/contrib/src/LuaBridge/detail/Userdata.h @@ -0,0 +1,817 @@ +//------------------------------------------------------------------------------ +/* + https://github.com/vinniefalco/LuaBridge + + Copyright 2012, Vinnie Falco + + License: The MIT License (http://www.opensource.org/licenses/mit-license.php) + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ +//============================================================================== + +//============================================================================== +/** + Return the identity pointer for our lightuserdata tokens. + + LuaBridge metatables are tagged with a security "token." The token is a + lightuserdata created from the identity pointer, used as a key in the + metatable. The value is a boolean = true, although any value could have been + used. + + Because of Lua's dynamic typing and our improvised system of imposing C++ + class structure, there is the possibility that executing scripts may + knowingly or unknowingly cause invalid data to get passed to the C functions + created by LuaBridge. In particular, our security model addresses the + following: + + Notes: + 1. Scripts cannot create a userdata (ignoring the debug lib). + 2. Scripts cannot create a lightuserdata (ignoring the debug lib). + 3. Scripts cannot set the metatable on a userdata. + 4. Our identity key is a unique pointer in the process. + 5. Our metatables have a lightuserdata identity key / value pair. + 6. Our metatables have "__metatable" set to a boolean = false. + 7. Our lightuserdata is unique. +*/ +inline void* getIdentityKey () +{ + static char value; + return &value; +} + +/** + Interface to a class pointer retrievable from a userdata. +*/ +class Userdata +{ +protected: + void* m_p; // subclasses must set this + + //-------------------------------------------------------------------------- + /** + Get an untyped pointer to the contained class. + */ + inline void* const getPointer () + { + return m_p; + } + +private: + //-------------------------------------------------------------------------- + /** + Validate and retrieve a Userdata on the stack. + + The Userdata must exactly match the corresponding class table or + const table, or else a Lua error is raised. This is used for the + __gc metamethod. + */ + static Userdata* getExactClass (lua_State* L, + int narg, + void const* classKey) + { + Userdata* ud = 0; + int const index = lua_absindex (L, narg); + + bool mismatch = false; + char const* got = 0; + + lua_rawgetp (L, LUA_REGISTRYINDEX, classKey); + assert (lua_istable (L, -1)); + + // Make sure we have a userdata. + if (!lua_isuserdata (L, index)) + mismatch = true; + + // Make sure it's metatable is ours. + if (!mismatch) + { + lua_getmetatable (L, index); + lua_rawgetp (L, -1, getIdentityKey ()); + if (lua_isboolean (L, -1)) + { + lua_pop (L, 1); + } + else + { + lua_pop (L, 2); + mismatch = true; + } + } + + if (!mismatch) + { + if (lua_rawequal (L, -1, -2)) + { + // Matches class table. + lua_pop (L, 2); + ud = static_cast (lua_touserdata (L, index)); + } + else + { + rawgetfield (L, -2, "__const"); + if (lua_rawequal (L, -1, -2)) + { + // Matches const table + lua_pop (L, 3); + ud = static_cast (lua_touserdata (L, index)); + } + else + { + // Mismatch, but its one of ours so get a type name. + rawgetfield (L, -2, "__type"); + lua_insert (L, -4); + lua_pop (L, 2); + got = lua_tostring (L, -2); + mismatch = true; + } + } + } + + if (mismatch) + { + rawgetfield (L, -1, "__type"); + assert (lua_type (L, -1) == LUA_TSTRING); + char const* const expected = lua_tostring (L, -1); + + if (got == 0) + got = lua_typename (L, lua_type (L, index)); + + char const* const msg = lua_pushfstring ( + L, "%s expected, got %s", expected, got); + + if (narg > 0) + luaL_argerror (L, narg, msg); + else + lua_error (L); + } + + return ud; + } + + //-------------------------------------------------------------------------- + /** + Validate and retrieve a Userdata on the stack. + + The Userdata must be derived from or the same as the given base class, + identified by the key. If canBeConst is false, generates an error if + the resulting Userdata represents to a const object. We do the type check + first so that the error message is informative. + */ + static Userdata* getClass (lua_State* L, + int index, + void const* baseClassKey, + bool canBeConst) + { + assert (index > 0); + Userdata* ud = 0; + + bool mismatch = false; + char const* got = 0; + + lua_rawgetp (L, LUA_REGISTRYINDEX, baseClassKey); + assert (lua_istable (L, -1)); + + // Make sure we have a userdata. + if (lua_isuserdata (L, index)) + { + // Make sure it's metatable is ours. + lua_getmetatable (L, index); + lua_rawgetp (L, -1, getIdentityKey ()); + if (lua_isboolean (L, -1)) + { + lua_pop (L, 1); + + // If __const is present, object is NOT const. + rawgetfield (L, -1, "__const"); + assert (lua_istable (L, -1) || lua_isnil (L, -1)); + bool const isConst = lua_isnil (L, -1); + lua_pop (L, 1); + + // Replace the class table with the const table if needed. + if (isConst) + { + rawgetfield (L, -2, "__const"); + assert (lua_istable (L, -1)); + lua_replace (L, -3); + } + + for (;;) + { + if (lua_rawequal (L, -1, -2)) + { + lua_pop (L, 2); + + // Match, now check const-ness. + if (isConst && !canBeConst) + { + luaL_argerror (L, index, "cannot be const"); + } + else + { + ud = static_cast (lua_touserdata (L, index)); + break; + } + } + else + { + // Replace current metatable with it's base class. + rawgetfield (L, -1, "__parent"); +/* +ud +class metatable +ud metatable +ud __parent (nil) +*/ + + if (lua_isnil (L, -1)) + { + lua_remove (L, -1); + // Mismatch, but its one of ours so get a type name. + rawgetfield (L, -1, "__type"); + lua_insert (L, -3); + lua_pop (L, 1); + got = lua_tostring (L, -2); + mismatch = true; + break; + } + else + { + lua_remove (L, -2); + } + } + } + } + else + { + lua_pop (L, 2); + mismatch = true; + } + } + else + { + mismatch = true; + } + + if (mismatch) + { + assert (lua_type (L, -1) == LUA_TTABLE); + rawgetfield (L, -1, "__type"); + assert (lua_type (L, -1) == LUA_TSTRING); + char const* const expected = lua_tostring (L, -1); + + if (got == 0) + got = lua_typename (L, lua_type (L, index)); + + char const* const msg = lua_pushfstring ( + L, "%s expected, got %s", expected, got); + + luaL_argerror (L, index, msg); + } + + return ud; + } + +public: + virtual ~Userdata () { } + + //-------------------------------------------------------------------------- + /** + Returns the Userdata* if the class on the Lua stack matches. + + If the class does not match, a Lua error is raised. + */ + template + static inline Userdata* getExact (lua_State* L, int index) + { + return getExactClass (L, index, ClassInfo ::getClassKey ()); + } + + //-------------------------------------------------------------------------- + /** + Get a pointer to the class from the Lua stack. + + If the object is not the class or a subclass, or it violates the + const-ness, a Lua error is raised. + */ + template + static inline T* get (lua_State* L, int index, bool canBeConst) + { + if (lua_isnil (L, index)) + return 0; + else + return static_cast (getClass (L, index, + ClassInfo ::getClassKey (), canBeConst)->getPointer ()); + } +}; + +//---------------------------------------------------------------------------- +/** + Wraps a class object stored in a Lua userdata. + + The lifetime of the object is managed by Lua. The object is constructed + inside the userdata using placement new. +*/ +template +class UserdataValue : public Userdata +{ +private: + UserdataValue (UserdataValue const&); + UserdataValue operator= (UserdataValue const&); + + char m_storage [sizeof (T)]; + + inline T* getObject () + { + // If this fails to compile it means you forgot to provide + // a Container specialization for your container! + // + return reinterpret_cast (&m_storage [0]); + } + +private: + /** + Used for placement construction. + */ + UserdataValue () + { + m_p = getObject (); + } + + ~UserdataValue () + { + getObject ()->~T (); + } + +public: + /** + Push a T via placement new. + + The caller is responsible for calling placement new using the + returned uninitialized storage. + */ + static void* place (lua_State* const L) + { + UserdataValue * const ud = new ( + lua_newuserdata (L, sizeof (UserdataValue ))) UserdataValue (); + lua_rawgetp (L, LUA_REGISTRYINDEX, ClassInfo ::getClassKey ()); + // If this goes off it means you forgot to register the class! + assert (lua_istable (L, -1)); + lua_setmetatable (L, -2); + return ud->getPointer (); + } + + /** + Push T via copy construction from U. + */ + template + static inline void push (lua_State* const L, U const& u) + { + new (place (L)) U (u); + } +}; + +//---------------------------------------------------------------------------- +/** + Wraps a pointer to a class object inside a Lua userdata. + + The lifetime of the object is managed by C++. +*/ +class UserdataPtr : public Userdata +{ +private: + UserdataPtr (UserdataPtr const&); + UserdataPtr operator= (UserdataPtr const&); + +private: + /** Push non-const pointer to object using metatable key. + */ + static void push (lua_State* L, void* const p, void const* const key) + { + if (p) + { + new (lua_newuserdata (L, sizeof (UserdataPtr))) UserdataPtr (p); + lua_rawgetp (L, LUA_REGISTRYINDEX, key); + // If this goes off it means you forgot to register the class! + assert (lua_istable (L, -1)); + lua_setmetatable (L, -2); + } + else + { + lua_pushnil (L); + } + } + + /** Push const pointer to object using metatable key. + */ + static void push (lua_State* L, void const* const p, void const* const key) + { + if (p) + { + new (lua_newuserdata (L, sizeof (UserdataPtr))) + UserdataPtr (const_cast (p)); + lua_rawgetp (L, LUA_REGISTRYINDEX, key); + // If this goes off it means you forgot to register the class! + assert (lua_istable (L, -1)); + lua_setmetatable (L, -2); + } + else + { + lua_pushnil (L); + } + } + + explicit UserdataPtr (void* const p) + { + m_p = p; + + // Can't construct with a null pointer! + // + assert (m_p != 0); + } + +public: + /** Push non-const pointer to object. + */ + template + static inline void push (lua_State* const L, T* const p) + { + if (p) + push (L, p, ClassInfo ::getClassKey ()); + else + lua_pushnil (L); + } + + /** Push const pointer to object. + */ + template + static inline void push (lua_State* const L, T const* const p) + { + if (p) + push (L, p, ClassInfo ::getConstKey ()); + else + lua_pushnil (L); + } +}; + +//============================================================================ +/** + Wraps a container thet references a class object. + + The template argument C is the container type, ContainerTraits must be + specialized on C or else a compile error will result. +*/ +template +class UserdataShared : public Userdata +{ +private: + UserdataShared (UserdataShared const&); + UserdataShared & operator= (UserdataShared const&); + + typedef typename TypeTraits::removeConst < + typename ContainerTraits ::Type>::Type T; + + C m_c; + +private: + ~UserdataShared () + { + } + +public: + /** + Construct from a container to the class or a derived class. + */ + template + explicit UserdataShared (U const& u) : m_c (u) + { + m_p = const_cast (reinterpret_cast ( + (ContainerTraits ::get (m_c)))); + } + + /** + Construct from a pointer to the class or a derived class. + */ + template + explicit UserdataShared (U* u) : m_c (u) + { + m_p = const_cast (reinterpret_cast ( + (ContainerTraits ::get (m_c)))); + } +}; + +//---------------------------------------------------------------------------- +// +// SFINAE helpers. +// + +// non-const objects +template +struct UserdataSharedHelper +{ + typedef typename TypeTraits::removeConst < + typename ContainerTraits ::Type>::Type T; + + static void push (lua_State* L, C const& c) + { + if (ContainerTraits ::get (c) != 0) + { + new (lua_newuserdata (L, sizeof (UserdataShared ))) UserdataShared (c); + lua_rawgetp (L, LUA_REGISTRYINDEX, ClassInfo ::getClassKey ()); + // If this goes off it means the class T is unregistered! + assert (lua_istable (L, -1)); + lua_setmetatable (L, -2); + } + else + { + lua_pushnil (L); + } + } + + static void push (lua_State* L, T* const t) + { + if (t) + { + new (lua_newuserdata (L, sizeof (UserdataShared ))) UserdataShared (t); + lua_rawgetp (L, LUA_REGISTRYINDEX, ClassInfo ::getClassKey ()); + // If this goes off it means the class T is unregistered! + assert (lua_istable (L, -1)); + lua_setmetatable (L, -2); + } + else + { + lua_pushnil (L); + } + } +}; + +// const objects +template +struct UserdataSharedHelper +{ + typedef typename TypeTraits::removeConst < + typename ContainerTraits ::Type>::Type T; + + static void push (lua_State* L, C const& c) + { + if (ContainerTraits ::get (c) != 0) + { + new (lua_newuserdata (L, sizeof (UserdataShared ))) UserdataShared (c); + lua_rawgetp (L, LUA_REGISTRYINDEX, ClassInfo ::getConstKey ()); + // If this goes off it means the class T is unregistered! + assert (lua_istable (L, -1)); + lua_setmetatable (L, -2); + } + else + { + lua_pushnil (L); + } + } + + static void push (lua_State* L, T* const t) + { + if (t) + { + new (lua_newuserdata (L, sizeof (UserdataShared ))) UserdataShared (t); + lua_rawgetp (L, LUA_REGISTRYINDEX, ClassInfo ::getConstKey ()); + // If this goes off it means the class T is unregistered! + assert (lua_istable (L, -1)); + lua_setmetatable (L, -2); + } + else + { + lua_pushnil (L); + } + } +}; + +/** + Pass by container. + + The container controls the object lifetime. Typically this will be a + lifetime shared by C++ and Lua using a reference count. Because of type + erasure, containers like std::shared_ptr will not work. Containers must + either be of the intrusive variety, or in the style of the RefCountedPtr + type provided by LuaBridge (that uses a global hash table). +*/ +template +struct StackHelper +{ + static inline void push (lua_State* L, C const& c) + { + UserdataSharedHelper ::Type>::value>::push (L, c); + } + + typedef typename TypeTraits::removeConst < + typename ContainerTraits ::Type>::Type T; + + static inline C get (lua_State* L, int index) + { + return Userdata::get (L, index, true); + } +}; + +/** + Pass by value. + + Lifetime is managed by Lua. A C++ function which accesses a pointer or + reference to an object outside the activation record in which it was + retrieved may result in undefined behavior if Lua garbage collected it. +*/ +template +struct StackHelper +{ + static inline void push (lua_State* L, T const& t) + { + UserdataValue ::push (L, t); + } + + static inline T const& get (lua_State* L, int index) + { + return *Userdata::get (L, index, true); + } +}; + +//============================================================================== + +/** + Lua stack conversions for class objects passed by value. +*/ +template +struct Stack +{ +public: + static inline void push (lua_State* L, T const& t) + { + StackHelper ::value>::push (L, t); + } + + static inline T get (lua_State* L, int index) + { + return StackHelper ::value>::get (L, index); + } +}; + +//------------------------------------------------------------------------------ +/** + Lua stack conversions for pointers and references to class objects. + + Lifetime is managed by C++. Lua code which remembers a reference to the + value may result in undefined behavior if C++ destroys the object. The + handling of the const and volatile qualifiers happens in UserdataPtr. +*/ + +// pointer +template +struct Stack +{ + static inline void push (lua_State* L, T* const p) + { + UserdataPtr::push (L, p); + } + + static inline T* const get (lua_State* L, int index) + { + return Userdata::get (L, index, false); + } +}; + +// Strips the const off the right side of * +template +struct Stack +{ + static inline void push (lua_State* L, T* const p) + { + UserdataPtr::push (L, p); + } + + static inline T* const get (lua_State* L, int index) + { + return Userdata::get (L, index, false); + } +}; + +// pointer to const +template +struct Stack +{ + static inline void push (lua_State* L, T const* const p) + { + UserdataPtr::push (L, p); + } + + static inline T const* const get (lua_State* L, int index) + { + return Userdata::get (L, index, true); + } +}; + +// Strips the const off the right side of * +template +struct Stack +{ + static inline void push (lua_State* L, T const* const p) + { + UserdataPtr::push (L, p); + } + + static inline T const* const get (lua_State* L, int index) + { + return Userdata::get (L, index, true); + } +}; + +// reference +template +struct Stack +{ + static inline void push (lua_State* L, T& t) + { + UserdataPtr::push (L, &t); + } + + static T& get (lua_State* L, int index) + { + T* const t = Userdata::get (L, index, false); + if (!t) + luaL_error (L, "nil passed to reference"); + return *t; + } +}; + +template +struct RefStackHelper +{ + typedef C return_type; + + static inline void push (lua_State* L, C const& t) + { + UserdataSharedHelper ::Type>::value>::push (L, t); + } + + typedef typename TypeTraits::removeConst < + typename ContainerTraits ::Type>::Type T; + + static return_type get (lua_State* L, int index) + { + return Userdata::get (L, index, true); + } +}; + +template +struct RefStackHelper +{ + typedef T const& return_type; + + static inline void push (lua_State* L, T const& t) + { + UserdataPtr::push (L, &t); + } + + static return_type get (lua_State* L, int index) + { + T const* const t = Userdata::get (L, index, true); + + if (!t) + luaL_error (L, "nil passed to reference"); + return *t; + } + +}; + +// reference to const +template +struct Stack +{ + typedef RefStackHelper ::value> helper_t; + + static inline void push (lua_State* L, T const& t) + { + helper_t::push (L, t); + } + + static typename helper_t::return_type get (lua_State* L, int index) + { + return helper_t::get (L, index); + } +}; diff --git a/contrib/src/LuaBridge/detail/dump.h b/contrib/src/LuaBridge/detail/dump.h new file mode 100644 index 0000000..c066803 --- /dev/null +++ b/contrib/src/LuaBridge/detail/dump.h @@ -0,0 +1,28 @@ +#include +#include + +std::string dumpLuaState(lua_State *L) { + std::stringstream ostr; + int i; + int top = lua_gettop(L); + ostr << "top=" << top << ":\n"; + for (i = 1; i <= top; ++i) { + int t = lua_type(L, i); + switch(t) { + case LUA_TSTRING: + ostr << " " << i << ": '" << lua_tostring(L, i) << "'\n"; + break; + case LUA_TBOOLEAN: + ostr << " " << i << ": " << + (lua_toboolean(L, i) ? "true" : "false") << "\n"; + break; + case LUA_TNUMBER: + ostr << " " << i << ": " << lua_tonumber(L, i) << "\n"; + break; + default: + ostr << " " << i << ": TYPE=" << lua_typename(L, t) << "\n"; + break; + } + } + return ostr.str(); +} diff --git a/embedding/csharp/uSCXMLEmbedding.suo b/embedding/csharp/uSCXMLEmbedding.suo index 3d75994..b9b13c0 100644 Binary files a/embedding/csharp/uSCXMLEmbedding.suo and b/embedding/csharp/uSCXMLEmbedding.suo differ diff --git a/src/uscxml/Factory.cpp b/src/uscxml/Factory.cpp index 0f3e8c9..62756fc 100644 --- a/src/uscxml/Factory.cpp +++ b/src/uscxml/Factory.cpp @@ -104,6 +104,10 @@ # include "uscxml/plugins/datamodel/prolog/swi/SWIDataModel.h" # endif +# ifdef LUA_FOUND +# include "uscxml/plugins/datamodel/lua/LuaDataModel.h" +# endif + #include "uscxml/plugins/datamodel/xpath/XPathDataModel.h" #include "uscxml/plugins/datamodel/promela/PromelaDataModel.h" @@ -299,6 +303,13 @@ void Factory::registerPlugins() { } #endif +#if (defined LUA_FOUND && defined BUILD_DM_LUA) + { + LuaDataModel* dataModel = new LuaDataModel(); + registerDataModel(dataModel); + } +#endif + #if (defined BUILD_DM_PROMELA) { PromelaDataModel* dataModel = new PromelaDataModel(); diff --git a/src/uscxml/Interpreter.cpp b/src/uscxml/Interpreter.cpp index e6fc8fa..d010a8a 100644 --- a/src/uscxml/Interpreter.cpp +++ b/src/uscxml/Interpreter.cpp @@ -2250,8 +2250,8 @@ NodeSet InterpreterImpl::getProperAncestors(const Arabica::DOM::Nod if (iequals(TAGNAME(nodeElem), _nsInfo.xmlNSPrefix + "scxml")) // do not return scxml root itself - this is somewhat ill-defined break; if (!iequals(TAGNAME(nodeElem), _nsInfo.xmlNSPrefix + "parallel") && - !iequals(TAGNAME(nodeElem), _nsInfo.xmlNSPrefix + "state") && - !iequals(TAGNAME(nodeElem), _nsInfo.xmlNSPrefix + "scxml")) + !iequals(TAGNAME(nodeElem), _nsInfo.xmlNSPrefix + "state") && + !iequals(TAGNAME(nodeElem), _nsInfo.xmlNSPrefix + "scxml")) break; if (node == s2) break; diff --git a/src/uscxml/interpreter/InterpreterDraft6.cpp b/src/uscxml/interpreter/InterpreterDraft6.cpp index 20f89d2..e2ba95e 100644 --- a/src/uscxml/interpreter/InterpreterDraft6.cpp +++ b/src/uscxml/interpreter/InterpreterDraft6.cpp @@ -948,10 +948,10 @@ void InterpreterDraft6::enterStates(const Arabica::XPath::NodeSet& if (isFinal(stateElem)) { internalDoneSend(stateElem); Node parent = stateElem.getParentNode(); - + if (parent.getNodeType() == Node_base::ELEMENT_NODE && - parent.getParentNode().getNodeType() == Node_base::ELEMENT_NODE && - isParallel(Element(parent.getParentNode()))) { + parent.getParentNode().getNodeType() == Node_base::ELEMENT_NODE && + isParallel(Element(parent.getParentNode()))) { Element grandParent = (Element)parent.getParentNode(); Arabica::XPath::NodeSet childs = getChildStates(grandParent); diff --git a/src/uscxml/plugins/datamodel/CMakeLists.txt b/src/uscxml/plugins/datamodel/CMakeLists.txt index 1b2a047..acf7344 100644 --- a/src/uscxml/plugins/datamodel/CMakeLists.txt +++ b/src/uscxml/plugins/datamodel/CMakeLists.txt @@ -79,6 +79,30 @@ file(GLOB NULL_DATAMODEL list (APPEND USCXML_FILES ${NULL_DATAMODEL}) +# Lua datamodel + +if (BUILD_DM_LUA AND LUA_FOUND) + set(USCXML_DATAMODELS "lua ${USCXML_DATAMODELS}") + file(GLOB LUA_DATAMODEL + lua/*.cpp + lua/*.h + ) + if (BUILD_AS_PLUGINS) + source_group("" FILES ${LUA_DATAMODEL}) + add_library(datamodel_lua SHARED ${LUA_DATAMODEL} "../Plugins.cpp") + target_link_libraries(datamodel_lua + uscxml + ${LUA_LIBRARIES} + ) + set_target_properties(datamodel_lua PROPERTIES FOLDER "Plugin DataModel") + set_target_properties(datamodel_lua PROPERTIES COMPILE_FLAGS "-DPLUMA_EXPORTS") + set_target_properties(datamodel_lua PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${OUTPUT_DIR}/lib") + else() + list (APPEND USCXML_FILES ${LUA_DATAMODEL}) + endif() +endif() + + # XPath datamodel if (BUILD_DM_XPATH) diff --git a/src/uscxml/plugins/datamodel/lua/LuaDataModel.cpp b/src/uscxml/plugins/datamodel/lua/LuaDataModel.cpp new file mode 100644 index 0000000..6fb0369 --- /dev/null +++ b/src/uscxml/plugins/datamodel/lua/LuaDataModel.cpp @@ -0,0 +1,199 @@ +/** + * @file + * @author 2012-2014 Stefan Radomski (stefan.radomski@cs.tu-darmstadt.de) + * @copyright Simplified BSD + * + * @cond + * This program is free software: you can redistribute it and/or modify + * it under the terms of the FreeBSD license as published by the FreeBSD + * project. + * + * This program 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. + * + * You should have received a copy of the FreeBSD license along with this + * program. If not, see . + * @endcond + */ + +#include + +#include "uscxml/Common.h" +#include "LuaDataModel.h" +#include "LuaBridge.h" +#include "uscxml/DOMUtils.h" + +#include "uscxml/Message.h" +#include + +#ifdef BUILD_AS_PLUGINS +#include +#endif + +namespace uscxml { + +#ifdef BUILD_AS_PLUGINS +PLUMA_CONNECTOR +bool pluginConnect(pluma::Host& host) { + host.add( new LuaDataModelProvider() ); + return true; +} +#endif + +LuaDataModel::LuaDataModel() { + _luaState = NULL; +} + +static int luaEventData(lua_State * l); +static int luaEventOrigin(lua_State * l); +static int luaEventOriginType(lua_State * l); +static int luaEventRaw(lua_State * l); +static int luaEventXML(lua_State * l); +static int luaEventName(lua_State * l); +static int luaEventContent(lua_State * l); +static int luaEventSendId(lua_State * l); +static int luaEventInvokeId(lua_State * l); +static int luaEventDestructor(lua_State * l); + +static int luaInFunction(lua_State * l) { + luabridge::LuaRef ref = luabridge::getGlobal(l, "__interpreter"); + InterpreterImpl* interpreter = ref.cast(); + + int stackSize = lua_gettop(l); + for (int i = 0; i < stackSize; i++) { + if (!lua_isstring(l, -1 - i)) + continue; + std::string stateName = lua_tostring(l, -1 - i); + if (interpreter->isInState(stateName)) + continue; + lua_pushboolean(l, 0); + return 1; + } + lua_pushboolean(l, 1); + return 1; +} + + +boost::shared_ptr LuaDataModel::create(InterpreterImpl* interpreter) { + boost::shared_ptr dm = boost::shared_ptr(new LuaDataModel()); + dm->_interpreter = interpreter; + dm->_luaState = luaL_newstate(); + luaL_openlibs(dm->_luaState); + + luabridge::getGlobalNamespace(dm->_luaState).beginClass("__interpreter").endClass(); + luabridge::getGlobalNamespace(dm->_luaState).addCFunction("In", luaInFunction); + + luabridge::setGlobal(dm->_luaState, dm->_interpreter, "__interpreter"); + + return dm; +} + +LuaDataModel::~LuaDataModel() { + if (_luaState != NULL) + lua_close(_luaState); +} + +void LuaDataModel::pushContext() { +} + +void LuaDataModel::popContext() { +} + +void LuaDataModel::initialize() { +} + +void LuaDataModel::setEvent(const Event& event) { +} + +Data LuaDataModel::getStringAsData(const std::string& content) { + Data data = Data::fromJSON(content); + if (data.empty()) { + data = Data(content, Data::VERBATIM); + } + return data; +} + +bool LuaDataModel::validate(const std::string& location, const std::string& schema) { + return true; +} + +bool LuaDataModel::isLocation(const std::string& expr) { + return true; +} + +uint32_t LuaDataModel::getLength(const std::string& expr) { + return 0; +} + +void LuaDataModel::setForeach(const std::string& item, + const std::string& array, + const std::string& index, + uint32_t iteration) { +} + +void LuaDataModel::eval(const Arabica::DOM::Element& scriptElem, + const std::string& expr) { + +} + +bool LuaDataModel::isDeclared(const std::string& expr) { + return true; +} + +void LuaDataModel::assign(const Arabica::DOM::Element& assignElem, + const Arabica::DOM::Node& node, + const std::string& content) { + +} + +void LuaDataModel::assign(const std::string& location, const Data& data) { + +} + +void LuaDataModel::init(const Arabica::DOM::Element& dataElem, + const Arabica::DOM::Node& node, + const std::string& content) { + +} + +void LuaDataModel::init(const std::string& location, const Data& data) { + +} + +/** + * The boolean expression language consists of the In predicate only. It has the + * form 'In(id)', where id is the id of a state in the enclosing state machine. + * The predicate must return 'true' if and only if that state is in the current + * state configuration. + */ +bool LuaDataModel::evalAsBool(const Arabica::DOM::Node& node, const std::string& expr) { + // we need the result of the expression on the lua stack -> has to "return"! + std::string trimmedExpr = boost::trim_copy(expr); + if (!boost::starts_with(trimmedExpr, "return")) { + trimmedExpr = "return(" + trimmedExpr + ")"; + } + int error = luaL_loadstring(_luaState, trimmedExpr.c_str()) || lua_pcall(_luaState, 0, LUA_MULTRET, 0); + if (error) { + std::string errMsg = lua_tostring(_luaState, -1); + lua_pop(_luaState, 1); /* pop error message from the stack */ + ERROR_EXECUTION_THROW(errMsg); + } + int stackSize = lua_gettop(_luaState); + if (stackSize != 1) + return false; + if (lua_isboolean(_luaState, -1)) + return lua_toboolean(_luaState, -1); + return false; +} + + +std::string LuaDataModel::evalAsString(const std::string& expr) { + return expr; +} + +double LuaDataModel::evalAsNumber(const std::string& expr) { + return 0; +} + +} \ No newline at end of file diff --git a/src/uscxml/plugins/datamodel/lua/LuaDataModel.h b/src/uscxml/plugins/datamodel/lua/LuaDataModel.h new file mode 100644 index 0000000..9677307 --- /dev/null +++ b/src/uscxml/plugins/datamodel/lua/LuaDataModel.h @@ -0,0 +1,111 @@ +/** + * @file + * @author 2012-2014 Stefan Radomski (stefan.radomski@cs.tu-darmstadt.de) + * @copyright Simplified BSD + * + * @cond + * This program is free software: you can redistribute it and/or modify + * it under the terms of the FreeBSD license as published by the FreeBSD + * project. + * + * This program 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. + * + * You should have received a copy of the FreeBSD license along with this + * program. If not, see . + * @endcond + */ + +#ifndef LUADATAMODEL_H_113E014C +#define LUADATAMODEL_H_113E014C + +#include "uscxml/Interpreter.h" +#include + +#ifdef BUILD_AS_PLUGINS +#include "uscxml/plugins/Plugins.h" +#endif + +extern "C" { +#include "lua.h" +#include "lualib.h" +#include "lauxlib.h" +} + +namespace uscxml { +class Event; +class Data; +} + +namespace uscxml { + +class LuaDataModel : public DataModelImpl { +public: + LuaDataModel(); + virtual ~LuaDataModel(); + virtual boost::shared_ptr create(InterpreterImpl* interpreter); + + virtual std::list getNames() { + std::list names; + names.push_back("lua"); + return names; + } + + virtual void initialize(); + virtual void setEvent(const Event& event); + + virtual bool validate(const std::string& location, const std::string& schema); + virtual bool isLocation(const std::string& expr); + + virtual uint32_t getLength(const std::string& expr); + virtual void setForeach(const std::string& item, + const std::string& array, + const std::string& index, + uint32_t iteration); + + virtual void pushContext(); + virtual void popContext(); + + virtual void assign(const Arabica::DOM::Element& assignElem, + const Arabica::DOM::Node& node, + const std::string& content); + virtual void assign(const std::string& location, const Data& data); + + virtual void init(const Arabica::DOM::Element& dataElem, + const Arabica::DOM::Node& node, + const std::string& content); + virtual void init(const std::string& location, const Data& data); + + virtual Data getStringAsData(const std::string& content); + virtual bool isDeclared(const std::string& expr); + + virtual void eval(const Arabica::DOM::Element& scriptElem, + const std::string& expr); + virtual std::string evalAsString(const std::string& expr); + virtual bool evalAsBool(const Arabica::DOM::Node& node, const std::string& expr); + virtual double evalAsNumber(const std::string& expr); + +protected: + + static int luaEventData(lua_State * l); + static int luaEventOrigin(lua_State * l); + static int luaEventOriginType(lua_State * l); + static int luaEventRaw(lua_State * l); + static int luaEventXML(lua_State * l); + static int luaEventName(lua_State * l); + static int luaEventContent(lua_State * l); + static int luaEventSendId(lua_State * l); + static int luaEventInvokeId(lua_State * l); + static int luaEventDestructor(lua_State * l); + + lua_State* _luaState; +}; + +#ifdef BUILD_AS_PLUGINS +PLUMA_INHERIT_PROVIDER(LuaDataModel, DataModelImpl); +#endif + +} + +#endif /* end of include guard: LUADATAMODEL_H_113E014C */ diff --git a/test/uscxml/test-lua.scxml b/test/uscxml/test-lua.scxml new file mode 100644 index 0000000..1168ca3 --- /dev/null +++ b/test/uscxml/test-lua.scxml @@ -0,0 +1,6 @@ + + + + + + diff --git a/test/w3c/lua/test144.scxml b/test/w3c/lua/test144.scxml new file mode 100644 index 0000000..07d34b5 --- /dev/null +++ b/test/w3c/lua/test144.scxml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test147.scxml b/test/w3c/lua/test147.scxml new file mode 100644 index 0000000..5e6d436 --- /dev/null +++ b/test/w3c/lua/test147.scxml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test148.scxml b/test/w3c/lua/test148.scxml new file mode 100644 index 0000000..821fbf8 --- /dev/null +++ b/test/w3c/lua/test148.scxml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test149.scxml b/test/w3c/lua/test149.scxml new file mode 100644 index 0000000..a949d88 --- /dev/null +++ b/test/w3c/lua/test149.scxml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test150.scxml b/test/w3c/lua/test150.scxml new file mode 100644 index 0000000..ea3ef06 --- /dev/null +++ b/test/w3c/lua/test150.scxml @@ -0,0 +1,35 @@ + + + + + + + {1,2,3} + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test151.scxml b/test/w3c/lua/test151.scxml new file mode 100644 index 0000000..1950a2d --- /dev/null +++ b/test/w3c/lua/test151.scxml @@ -0,0 +1,35 @@ + + + + + + + {1,2,3} + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test152.scxml b/test/w3c/lua/test152.scxml new file mode 100644 index 0000000..1147c4b --- /dev/null +++ b/test/w3c/lua/test152.scxml @@ -0,0 +1,41 @@ + + + + + + + + + {1,2,3} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test153.scxml b/test/w3c/lua/test153.scxml new file mode 100644 index 0000000..5fd07d4 --- /dev/null +++ b/test/w3c/lua/test153.scxml @@ -0,0 +1,32 @@ + + + + + + + + + {1,2,3} + + + + + + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test155.scxml b/test/w3c/lua/test155.scxml new file mode 100644 index 0000000..2064a37 --- /dev/null +++ b/test/w3c/lua/test155.scxml @@ -0,0 +1,21 @@ + + + + + + + {1,2,3} + + + + + + + + + + + + + diff --git a/test/w3c/lua/test156.scxml b/test/w3c/lua/test156.scxml new file mode 100644 index 0000000..6eaff52 --- /dev/null +++ b/test/w3c/lua/test156.scxml @@ -0,0 +1,23 @@ + + + + + + + {1,2,3} + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test158.scxml b/test/w3c/lua/test158.scxml new file mode 100644 index 0000000..8702557 --- /dev/null +++ b/test/w3c/lua/test158.scxml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test159.scxml b/test/w3c/lua/test159.scxml new file mode 100644 index 0000000..5415b31 --- /dev/null +++ b/test/w3c/lua/test159.scxml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test172.scxml b/test/w3c/lua/test172.scxml new file mode 100644 index 0000000..f8876e3 --- /dev/null +++ b/test/w3c/lua/test172.scxml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test173.scxml b/test/w3c/lua/test173.scxml new file mode 100644 index 0000000..c904438 --- /dev/null +++ b/test/w3c/lua/test173.scxml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test174.scxml b/test/w3c/lua/test174.scxml new file mode 100644 index 0000000..02d22b6 --- /dev/null +++ b/test/w3c/lua/test174.scxml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test175.scxml b/test/w3c/lua/test175.scxml new file mode 100644 index 0000000..17da2c7 --- /dev/null +++ b/test/w3c/lua/test175.scxml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test176.scxml b/test/w3c/lua/test176.scxml new file mode 100644 index 0000000..97f8f51 --- /dev/null +++ b/test/w3c/lua/test176.scxml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test178.scxml b/test/w3c/lua/test178.scxml new file mode 100644 index 0000000..11361e1 --- /dev/null +++ b/test/w3c/lua/test178.scxml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test179.scxml b/test/w3c/lua/test179.scxml new file mode 100644 index 0000000..c8647c7 --- /dev/null +++ b/test/w3c/lua/test179.scxml @@ -0,0 +1,15 @@ + + + + + + + 123 + + + + + + + + diff --git a/test/w3c/lua/test183.scxml b/test/w3c/lua/test183.scxml new file mode 100644 index 0000000..2b36df9 --- /dev/null +++ b/test/w3c/lua/test183.scxml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test185.scxml b/test/w3c/lua/test185.scxml new file mode 100644 index 0000000..bb1281e --- /dev/null +++ b/test/w3c/lua/test185.scxml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test186.scxml b/test/w3c/lua/test186.scxml new file mode 100644 index 0000000..f0a6fc4 --- /dev/null +++ b/test/w3c/lua/test186.scxml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test187.scxml b/test/w3c/lua/test187.scxml new file mode 100644 index 0000000..48aac56 --- /dev/null +++ b/test/w3c/lua/test187.scxml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test189.scxml b/test/w3c/lua/test189.scxml new file mode 100644 index 0000000..09abfc3 --- /dev/null +++ b/test/w3c/lua/test189.scxml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test190.scxml b/test/w3c/lua/test190.scxml new file mode 100644 index 0000000..09ad268 --- /dev/null +++ b/test/w3c/lua/test190.scxml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test191.scxml b/test/w3c/lua/test191.scxml new file mode 100644 index 0000000..40b180a --- /dev/null +++ b/test/w3c/lua/test191.scxml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test192.scxml b/test/w3c/lua/test192.scxml new file mode 100644 index 0000000..22be823 --- /dev/null +++ b/test/w3c/lua/test192.scxml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test193.scxml b/test/w3c/lua/test193.scxml new file mode 100644 index 0000000..f533f5d --- /dev/null +++ b/test/w3c/lua/test193.scxml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test194.scxml b/test/w3c/lua/test194.scxml new file mode 100644 index 0000000..989e447 --- /dev/null +++ b/test/w3c/lua/test194.scxml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test198.scxml b/test/w3c/lua/test198.scxml new file mode 100644 index 0000000..e4a5be0 --- /dev/null +++ b/test/w3c/lua/test198.scxml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test199.scxml b/test/w3c/lua/test199.scxml new file mode 100644 index 0000000..9d152ff --- /dev/null +++ b/test/w3c/lua/test199.scxml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test200.scxml b/test/w3c/lua/test200.scxml new file mode 100644 index 0000000..cfb3837 --- /dev/null +++ b/test/w3c/lua/test200.scxml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test201.scxml b/test/w3c/lua/test201.scxml new file mode 100644 index 0000000..f5f30f6 --- /dev/null +++ b/test/w3c/lua/test201.scxml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test205.scxml b/test/w3c/lua/test205.scxml new file mode 100644 index 0000000..3f09cb5 --- /dev/null +++ b/test/w3c/lua/test205.scxml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test207.scxml b/test/w3c/lua/test207.scxml new file mode 100644 index 0000000..0672356 --- /dev/null +++ b/test/w3c/lua/test207.scxml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test208.scxml b/test/w3c/lua/test208.scxml new file mode 100644 index 0000000..3217f31 --- /dev/null +++ b/test/w3c/lua/test208.scxml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test210.scxml b/test/w3c/lua/test210.scxml new file mode 100644 index 0000000..2de3e1d --- /dev/null +++ b/test/w3c/lua/test210.scxml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test215.scxml b/test/w3c/lua/test215.scxml new file mode 100644 index 0000000..26d4819 --- /dev/null +++ b/test/w3c/lua/test215.scxml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test216.scxml b/test/w3c/lua/test216.scxml new file mode 100644 index 0000000..5a09fc7 --- /dev/null +++ b/test/w3c/lua/test216.scxml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test216sub1.scxml b/test/w3c/lua/test216sub1.scxml new file mode 100644 index 0000000..e1d9195 --- /dev/null +++ b/test/w3c/lua/test216sub1.scxml @@ -0,0 +1,5 @@ + + + + + diff --git a/test/w3c/lua/test220.scxml b/test/w3c/lua/test220.scxml new file mode 100644 index 0000000..bf1ef9d --- /dev/null +++ b/test/w3c/lua/test220.scxml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test223.scxml b/test/w3c/lua/test223.scxml new file mode 100644 index 0000000..92cf1a9 --- /dev/null +++ b/test/w3c/lua/test223.scxml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test224.scxml b/test/w3c/lua/test224.scxml new file mode 100644 index 0000000..7a095e0 --- /dev/null +++ b/test/w3c/lua/test224.scxml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test225.scxml b/test/w3c/lua/test225.scxml new file mode 100644 index 0000000..d370f9b --- /dev/null +++ b/test/w3c/lua/test225.scxml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test226.scxml b/test/w3c/lua/test226.scxml new file mode 100644 index 0000000..35351d3 --- /dev/null +++ b/test/w3c/lua/test226.scxml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test226sub1.scxml b/test/w3c/lua/test226sub1.scxml new file mode 100644 index 0000000..75dde69 --- /dev/null +++ b/test/w3c/lua/test226sub1.scxml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test228.scxml b/test/w3c/lua/test228.scxml new file mode 100644 index 0000000..b81675f --- /dev/null +++ b/test/w3c/lua/test228.scxml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test229.scxml b/test/w3c/lua/test229.scxml new file mode 100644 index 0000000..b11bd8c --- /dev/null +++ b/test/w3c/lua/test229.scxml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test230.scxml b/test/w3c/lua/test230.scxml new file mode 100644 index 0000000..33b1239 --- /dev/null +++ b/test/w3c/lua/test230.scxml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test232.scxml b/test/w3c/lua/test232.scxml new file mode 100644 index 0000000..8e7503e --- /dev/null +++ b/test/w3c/lua/test232.scxml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test233.scxml b/test/w3c/lua/test233.scxml new file mode 100644 index 0000000..ea6975b --- /dev/null +++ b/test/w3c/lua/test233.scxml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test234.scxml b/test/w3c/lua/test234.scxml new file mode 100644 index 0000000..a99b053 --- /dev/null +++ b/test/w3c/lua/test234.scxml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test235.scxml b/test/w3c/lua/test235.scxml new file mode 100644 index 0000000..4575cc5 --- /dev/null +++ b/test/w3c/lua/test235.scxml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test236.scxml b/test/w3c/lua/test236.scxml new file mode 100644 index 0000000..333c68b --- /dev/null +++ b/test/w3c/lua/test236.scxml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test237.scxml b/test/w3c/lua/test237.scxml new file mode 100644 index 0000000..b64f87f --- /dev/null +++ b/test/w3c/lua/test237.scxml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test239.scxml b/test/w3c/lua/test239.scxml new file mode 100644 index 0000000..dc3fff9 --- /dev/null +++ b/test/w3c/lua/test239.scxml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test239sub1.scxml b/test/w3c/lua/test239sub1.scxml new file mode 100644 index 0000000..4720f59 --- /dev/null +++ b/test/w3c/lua/test239sub1.scxml @@ -0,0 +1,5 @@ + + + + + diff --git a/test/w3c/lua/test240.scxml b/test/w3c/lua/test240.scxml new file mode 100644 index 0000000..bd79eb6 --- /dev/null +++ b/test/w3c/lua/test240.scxml @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test241.scxml b/test/w3c/lua/test241.scxml new file mode 100644 index 0000000..e476227 --- /dev/null +++ b/test/w3c/lua/test241.scxml @@ -0,0 +1,88 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test242.scxml b/test/w3c/lua/test242.scxml new file mode 100644 index 0000000..36e8034 --- /dev/null +++ b/test/w3c/lua/test242.scxml @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test242sub1.scxml b/test/w3c/lua/test242sub1.scxml new file mode 100644 index 0000000..4720f59 --- /dev/null +++ b/test/w3c/lua/test242sub1.scxml @@ -0,0 +1,5 @@ + + + + + diff --git a/test/w3c/lua/test243.scxml b/test/w3c/lua/test243.scxml new file mode 100644 index 0000000..7e1f854 --- /dev/null +++ b/test/w3c/lua/test243.scxml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test244.scxml b/test/w3c/lua/test244.scxml new file mode 100644 index 0000000..a6e6c95 --- /dev/null +++ b/test/w3c/lua/test244.scxml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test245.scxml b/test/w3c/lua/test245.scxml new file mode 100644 index 0000000..cb32e22 --- /dev/null +++ b/test/w3c/lua/test245.scxml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test247.scxml b/test/w3c/lua/test247.scxml new file mode 100644 index 0000000..cc7e910 --- /dev/null +++ b/test/w3c/lua/test247.scxml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test250.scxml b/test/w3c/lua/test250.scxml new file mode 100644 index 0000000..d522ad9 --- /dev/null +++ b/test/w3c/lua/test250.scxml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test252.scxml b/test/w3c/lua/test252.scxml new file mode 100644 index 0000000..29ae000 --- /dev/null +++ b/test/w3c/lua/test252.scxml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test253.scxml b/test/w3c/lua/test253.scxml new file mode 100644 index 0000000..1e9b626 --- /dev/null +++ b/test/w3c/lua/test253.scxml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test276.scxml b/test/w3c/lua/test276.scxml new file mode 100644 index 0000000..6af188d --- /dev/null +++ b/test/w3c/lua/test276.scxml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + diff --git a/test/w3c/lua/test276sub1.scxml b/test/w3c/lua/test276sub1.scxml new file mode 100644 index 0000000..7db93cd --- /dev/null +++ b/test/w3c/lua/test276sub1.scxml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test277.scxml b/test/w3c/lua/test277.scxml new file mode 100644 index 0000000..7c0301c --- /dev/null +++ b/test/w3c/lua/test277.scxml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test278.scxml b/test/w3c/lua/test278.scxml new file mode 100644 index 0000000..fdd9063 --- /dev/null +++ b/test/w3c/lua/test278.scxml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test279.scxml b/test/w3c/lua/test279.scxml new file mode 100644 index 0000000..1eaac16 --- /dev/null +++ b/test/w3c/lua/test279.scxml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test280.scxml b/test/w3c/lua/test280.scxml new file mode 100644 index 0000000..e7cd5b1 --- /dev/null +++ b/test/w3c/lua/test280.scxml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test286.scxml b/test/w3c/lua/test286.scxml new file mode 100644 index 0000000..7c47d91 --- /dev/null +++ b/test/w3c/lua/test286.scxml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test287.scxml b/test/w3c/lua/test287.scxml new file mode 100644 index 0000000..68ad7a6 --- /dev/null +++ b/test/w3c/lua/test287.scxml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test294.scxml b/test/w3c/lua/test294.scxml new file mode 100644 index 0000000..90c000e --- /dev/null +++ b/test/w3c/lua/test294.scxml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test298.scxml b/test/w3c/lua/test298.scxml new file mode 100644 index 0000000..c421a59 --- /dev/null +++ b/test/w3c/lua/test298.scxml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test301.scxml b/test/w3c/lua/test301.scxml new file mode 100644 index 0000000..39aed2e --- /dev/null +++ b/test/w3c/lua/test301.scxml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/test/w3c/lua/test303.scxml b/test/w3c/lua/test303.scxml new file mode 100644 index 0000000..88f79b0 --- /dev/null +++ b/test/w3c/lua/test303.scxml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test304.scxml b/test/w3c/lua/test304.scxml new file mode 100644 index 0000000..2022f50 --- /dev/null +++ b/test/w3c/lua/test304.scxml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/test/w3c/lua/test307.scxml b/test/w3c/lua/test307.scxml new file mode 100644 index 0000000..3663d5f --- /dev/null +++ b/test/w3c/lua/test307.scxml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test309.scxml b/test/w3c/lua/test309.scxml new file mode 100644 index 0000000..8a9195c --- /dev/null +++ b/test/w3c/lua/test309.scxml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/test/w3c/lua/test310.scxml b/test/w3c/lua/test310.scxml new file mode 100644 index 0000000..89297af --- /dev/null +++ b/test/w3c/lua/test310.scxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/test/w3c/lua/test311.scxml b/test/w3c/lua/test311.scxml new file mode 100644 index 0000000..4eab475 --- /dev/null +++ b/test/w3c/lua/test311.scxml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test312.scxml b/test/w3c/lua/test312.scxml new file mode 100644 index 0000000..7207dbe --- /dev/null +++ b/test/w3c/lua/test312.scxml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test313.scxml b/test/w3c/lua/test313.scxml new file mode 100644 index 0000000..7045cda --- /dev/null +++ b/test/w3c/lua/test313.scxml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test314.scxml b/test/w3c/lua/test314.scxml new file mode 100644 index 0000000..d914420 --- /dev/null +++ b/test/w3c/lua/test314.scxml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test318.scxml b/test/w3c/lua/test318.scxml new file mode 100644 index 0000000..dc2c885 --- /dev/null +++ b/test/w3c/lua/test318.scxml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test319.scxml b/test/w3c/lua/test319.scxml new file mode 100644 index 0000000..06ac189 --- /dev/null +++ b/test/w3c/lua/test319.scxml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test321.scxml b/test/w3c/lua/test321.scxml new file mode 100644 index 0000000..b141cd2 --- /dev/null +++ b/test/w3c/lua/test321.scxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/test/w3c/lua/test322.scxml b/test/w3c/lua/test322.scxml new file mode 100644 index 0000000..49e5b6e --- /dev/null +++ b/test/w3c/lua/test322.scxml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test323.scxml b/test/w3c/lua/test323.scxml new file mode 100644 index 0000000..1233bc5 --- /dev/null +++ b/test/w3c/lua/test323.scxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/test/w3c/lua/test324.scxml b/test/w3c/lua/test324.scxml new file mode 100644 index 0000000..1222cee --- /dev/null +++ b/test/w3c/lua/test324.scxml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test325.scxml b/test/w3c/lua/test325.scxml new file mode 100644 index 0000000..b61d2e1 --- /dev/null +++ b/test/w3c/lua/test325.scxml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + diff --git a/test/w3c/lua/test326.scxml b/test/w3c/lua/test326.scxml new file mode 100644 index 0000000..c6d3a17 --- /dev/null +++ b/test/w3c/lua/test326.scxml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test329.scxml b/test/w3c/lua/test329.scxml new file mode 100644 index 0000000..6f2f0a0 --- /dev/null +++ b/test/w3c/lua/test329.scxml @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test330.scxml b/test/w3c/lua/test330.scxml new file mode 100644 index 0000000..9e79f3a --- /dev/null +++ b/test/w3c/lua/test330.scxml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test331.scxml b/test/w3c/lua/test331.scxml new file mode 100644 index 0000000..7598bf4 --- /dev/null +++ b/test/w3c/lua/test331.scxml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test332.scxml b/test/w3c/lua/test332.scxml new file mode 100644 index 0000000..ebdd390 --- /dev/null +++ b/test/w3c/lua/test332.scxml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test333.scxml b/test/w3c/lua/test333.scxml new file mode 100644 index 0000000..96ea4bf --- /dev/null +++ b/test/w3c/lua/test333.scxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/test/w3c/lua/test335.scxml b/test/w3c/lua/test335.scxml new file mode 100644 index 0000000..d31a209 --- /dev/null +++ b/test/w3c/lua/test335.scxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/test/w3c/lua/test336.scxml b/test/w3c/lua/test336.scxml new file mode 100644 index 0000000..fe0899f --- /dev/null +++ b/test/w3c/lua/test336.scxml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test337.scxml b/test/w3c/lua/test337.scxml new file mode 100644 index 0000000..641838b --- /dev/null +++ b/test/w3c/lua/test337.scxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/test/w3c/lua/test338.scxml b/test/w3c/lua/test338.scxml new file mode 100644 index 0000000..5772da0 --- /dev/null +++ b/test/w3c/lua/test338.scxml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test339.scxml b/test/w3c/lua/test339.scxml new file mode 100644 index 0000000..3c60863 --- /dev/null +++ b/test/w3c/lua/test339.scxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/test/w3c/lua/test342.scxml b/test/w3c/lua/test342.scxml new file mode 100644 index 0000000..dce833b --- /dev/null +++ b/test/w3c/lua/test342.scxml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test343.scxml b/test/w3c/lua/test343.scxml new file mode 100644 index 0000000..b8da21c --- /dev/null +++ b/test/w3c/lua/test343.scxml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test344.scxml b/test/w3c/lua/test344.scxml new file mode 100644 index 0000000..467a824 --- /dev/null +++ b/test/w3c/lua/test344.scxml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test346.scxml b/test/w3c/lua/test346.scxml new file mode 100644 index 0000000..be7e2dd --- /dev/null +++ b/test/w3c/lua/test346.scxml @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test347.scxml b/test/w3c/lua/test347.scxml new file mode 100644 index 0000000..1f33911 --- /dev/null +++ b/test/w3c/lua/test347.scxml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test348.scxml b/test/w3c/lua/test348.scxml new file mode 100644 index 0000000..af7c220 --- /dev/null +++ b/test/w3c/lua/test348.scxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/test/w3c/lua/test349.scxml b/test/w3c/lua/test349.scxml new file mode 100644 index 0000000..78a2487 --- /dev/null +++ b/test/w3c/lua/test349.scxml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test350.scxml b/test/w3c/lua/test350.scxml new file mode 100644 index 0000000..73e7ca8 --- /dev/null +++ b/test/w3c/lua/test350.scxml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test351.scxml b/test/w3c/lua/test351.scxml new file mode 100644 index 0000000..e839548 --- /dev/null +++ b/test/w3c/lua/test351.scxml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test352.scxml b/test/w3c/lua/test352.scxml new file mode 100644 index 0000000..ea76b20 --- /dev/null +++ b/test/w3c/lua/test352.scxml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test354.scxml b/test/w3c/lua/test354.scxml new file mode 100644 index 0000000..4acecf3 --- /dev/null +++ b/test/w3c/lua/test354.scxml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + foo + + + + + + + + diff --git a/test/w3c/lua/test355.scxml b/test/w3c/lua/test355.scxml new file mode 100644 index 0000000..914f9f4 --- /dev/null +++ b/test/w3c/lua/test355.scxml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/test/w3c/lua/test364.scxml b/test/w3c/lua/test364.scxml new file mode 100644 index 0000000..94d86bb --- /dev/null +++ b/test/w3c/lua/test364.scxml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test372.scxml b/test/w3c/lua/test372.scxml new file mode 100644 index 0000000..9a04396 --- /dev/null +++ b/test/w3c/lua/test372.scxml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test375.scxml b/test/w3c/lua/test375.scxml new file mode 100644 index 0000000..aee863e --- /dev/null +++ b/test/w3c/lua/test375.scxml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test376.scxml b/test/w3c/lua/test376.scxml new file mode 100644 index 0000000..d0f6911 --- /dev/null +++ b/test/w3c/lua/test376.scxml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test377.scxml b/test/w3c/lua/test377.scxml new file mode 100644 index 0000000..f5bd0b0 --- /dev/null +++ b/test/w3c/lua/test377.scxml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test378.scxml b/test/w3c/lua/test378.scxml new file mode 100644 index 0000000..56ea4da --- /dev/null +++ b/test/w3c/lua/test378.scxml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test387.scxml b/test/w3c/lua/test387.scxml new file mode 100644 index 0000000..7ea485f --- /dev/null +++ b/test/w3c/lua/test387.scxml @@ -0,0 +1,85 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test388.scxml b/test/w3c/lua/test388.scxml new file mode 100644 index 0000000..35bd399 --- /dev/null +++ b/test/w3c/lua/test388.scxml @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test396.scxml b/test/w3c/lua/test396.scxml new file mode 100644 index 0000000..1b042a2 --- /dev/null +++ b/test/w3c/lua/test396.scxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/test/w3c/lua/test399.scxml b/test/w3c/lua/test399.scxml new file mode 100644 index 0000000..5771fb7 --- /dev/null +++ b/test/w3c/lua/test399.scxml @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test401.scxml b/test/w3c/lua/test401.scxml new file mode 100644 index 0000000..f068ac9 --- /dev/null +++ b/test/w3c/lua/test401.scxml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test402.scxml b/test/w3c/lua/test402.scxml new file mode 100644 index 0000000..11ce8ea --- /dev/null +++ b/test/w3c/lua/test402.scxml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test403a.scxml b/test/w3c/lua/test403a.scxml new file mode 100644 index 0000000..767197f --- /dev/null +++ b/test/w3c/lua/test403a.scxml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test403b.scxml b/test/w3c/lua/test403b.scxml new file mode 100644 index 0000000..2de4d9a --- /dev/null +++ b/test/w3c/lua/test403b.scxml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test403c.scxml b/test/w3c/lua/test403c.scxml new file mode 100644 index 0000000..200e0ff --- /dev/null +++ b/test/w3c/lua/test403c.scxml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test404.scxml b/test/w3c/lua/test404.scxml new file mode 100644 index 0000000..8803483 --- /dev/null +++ b/test/w3c/lua/test404.scxml @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test405.scxml b/test/w3c/lua/test405.scxml new file mode 100644 index 0000000..54dde5f --- /dev/null +++ b/test/w3c/lua/test405.scxml @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test406.scxml b/test/w3c/lua/test406.scxml new file mode 100644 index 0000000..eb4fa7b --- /dev/null +++ b/test/w3c/lua/test406.scxml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test407.scxml b/test/w3c/lua/test407.scxml new file mode 100644 index 0000000..2b459d8 --- /dev/null +++ b/test/w3c/lua/test407.scxml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test409.scxml b/test/w3c/lua/test409.scxml new file mode 100644 index 0000000..ccf9d73 --- /dev/null +++ b/test/w3c/lua/test409.scxml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test411.scxml b/test/w3c/lua/test411.scxml new file mode 100644 index 0000000..7cec20a --- /dev/null +++ b/test/w3c/lua/test411.scxml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test412.scxml b/test/w3c/lua/test412.scxml new file mode 100644 index 0000000..a55514b --- /dev/null +++ b/test/w3c/lua/test412.scxml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test413.scxml b/test/w3c/lua/test413.scxml new file mode 100644 index 0000000..7b2563b --- /dev/null +++ b/test/w3c/lua/test413.scxml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test415.scxml b/test/w3c/lua/test415.scxml new file mode 100644 index 0000000..c2e883a --- /dev/null +++ b/test/w3c/lua/test415.scxml @@ -0,0 +1,13 @@ + + + + + + + + + diff --git a/test/w3c/lua/test416.scxml b/test/w3c/lua/test416.scxml new file mode 100644 index 0000000..b3ba383 --- /dev/null +++ b/test/w3c/lua/test416.scxml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test417.scxml b/test/w3c/lua/test417.scxml new file mode 100644 index 0000000..5a500f7 --- /dev/null +++ b/test/w3c/lua/test417.scxml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test419.scxml b/test/w3c/lua/test419.scxml new file mode 100644 index 0000000..1043b31 --- /dev/null +++ b/test/w3c/lua/test419.scxml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test421.scxml b/test/w3c/lua/test421.scxml new file mode 100644 index 0000000..358d260 --- /dev/null +++ b/test/w3c/lua/test421.scxml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test422.scxml b/test/w3c/lua/test422.scxml new file mode 100644 index 0000000..f97b3bc --- /dev/null +++ b/test/w3c/lua/test422.scxml @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test423.scxml b/test/w3c/lua/test423.scxml new file mode 100644 index 0000000..d083110 --- /dev/null +++ b/test/w3c/lua/test423.scxml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test436.scxml b/test/w3c/lua/test436.scxml new file mode 100644 index 0000000..da5f5a6 --- /dev/null +++ b/test/w3c/lua/test436.scxml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test444.scxml b/test/w3c/lua/test444.scxml new file mode 100644 index 0000000..2ec8b38 --- /dev/null +++ b/test/w3c/lua/test444.scxml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test445.scxml b/test/w3c/lua/test445.scxml new file mode 100644 index 0000000..2946c9d --- /dev/null +++ b/test/w3c/lua/test445.scxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/test/w3c/lua/test446.scxml b/test/w3c/lua/test446.scxml new file mode 100644 index 0000000..79f8652 --- /dev/null +++ b/test/w3c/lua/test446.scxml @@ -0,0 +1,19 @@ + + + + + [1, 2, 3] + + + + + + + + + + + + + diff --git a/test/w3c/lua/test446.txt b/test/w3c/lua/test446.txt new file mode 100644 index 0000000..3a26a2e --- /dev/null +++ b/test/w3c/lua/test446.txt @@ -0,0 +1 @@ +[1,2,3] \ No newline at end of file diff --git a/test/w3c/lua/test448.scxml b/test/w3c/lua/test448.scxml new file mode 100644 index 0000000..abe7957 --- /dev/null +++ b/test/w3c/lua/test448.scxml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test449.scxml b/test/w3c/lua/test449.scxml new file mode 100644 index 0000000..f0f1830 --- /dev/null +++ b/test/w3c/lua/test449.scxml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/test/w3c/lua/test451.scxml b/test/w3c/lua/test451.scxml new file mode 100644 index 0000000..08f04cc --- /dev/null +++ b/test/w3c/lua/test451.scxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/test/w3c/lua/test452.scxml b/test/w3c/lua/test452.scxml new file mode 100644 index 0000000..2965bb0 --- /dev/null +++ b/test/w3c/lua/test452.scxml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test453.scxml b/test/w3c/lua/test453.scxml new file mode 100644 index 0000000..e5337fa --- /dev/null +++ b/test/w3c/lua/test453.scxml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test456.scxml b/test/w3c/lua/test456.scxml new file mode 100644 index 0000000..319c1a4 --- /dev/null +++ b/test/w3c/lua/test456.scxml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test457.scxml b/test/w3c/lua/test457.scxml new file mode 100644 index 0000000..4a7ad33 --- /dev/null +++ b/test/w3c/lua/test457.scxml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test459.scxml b/test/w3c/lua/test459.scxml new file mode 100644 index 0000000..54029a1 --- /dev/null +++ b/test/w3c/lua/test459.scxml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test460.scxml b/test/w3c/lua/test460.scxml new file mode 100644 index 0000000..9997296 --- /dev/null +++ b/test/w3c/lua/test460.scxml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test463.scxml b/test/w3c/lua/test463.scxml new file mode 100644 index 0000000..23ca9cf --- /dev/null +++ b/test/w3c/lua/test463.scxml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + diff --git a/test/w3c/lua/test464.scxml b/test/w3c/lua/test464.scxml new file mode 100644 index 0000000..ddbef86 --- /dev/null +++ b/test/w3c/lua/test464.scxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/test/w3c/lua/test465.scxml b/test/w3c/lua/test465.scxml new file mode 100644 index 0000000..50e708a --- /dev/null +++ b/test/w3c/lua/test465.scxml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test466.scxml b/test/w3c/lua/test466.scxml new file mode 100644 index 0000000..51896b4 --- /dev/null +++ b/test/w3c/lua/test466.scxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/test/w3c/lua/test467.scxml b/test/w3c/lua/test467.scxml new file mode 100644 index 0000000..673a561 --- /dev/null +++ b/test/w3c/lua/test467.scxml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/test/w3c/lua/test468.scxml b/test/w3c/lua/test468.scxml new file mode 100644 index 0000000..8c0c74a --- /dev/null +++ b/test/w3c/lua/test468.scxml @@ -0,0 +1,22 @@ + + + + + + + New York + Boston + + + + + + + + + + + + + diff --git a/test/w3c/lua/test469.scxml b/test/w3c/lua/test469.scxml new file mode 100644 index 0000000..487029d --- /dev/null +++ b/test/w3c/lua/test469.scxml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test470.scxml b/test/w3c/lua/test470.scxml new file mode 100644 index 0000000..68d55bc --- /dev/null +++ b/test/w3c/lua/test470.scxml @@ -0,0 +1,22 @@ + + + + + + + 2 + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test473.scxml b/test/w3c/lua/test473.scxml new file mode 100644 index 0000000..45dfb40 --- /dev/null +++ b/test/w3c/lua/test473.scxml @@ -0,0 +1,36 @@ + + + + + + + + + The Zen Mind + + + Freakonomics + + + + + + + + + + + + + 12334455 + some author + + + + + + + + + diff --git a/test/w3c/lua/test474.scxml b/test/w3c/lua/test474.scxml new file mode 100644 index 0000000..fdbce30 --- /dev/null +++ b/test/w3c/lua/test474.scxml @@ -0,0 +1,35 @@ + + + + + + + + + The Zen Mind + + + Freakonomics + + + + + + + + + + + + + 12334455 + some author + + + + + + + + + diff --git a/test/w3c/lua/test475.scxml b/test/w3c/lua/test475.scxml new file mode 100644 index 0000000..dc01a91 --- /dev/null +++ b/test/w3c/lua/test475.scxml @@ -0,0 +1,35 @@ + + + + + + + + + The Zen Mind + + + Freakonomics + + + + + + + + + + + + + 12334455 + some author + + + + + + + + + diff --git a/test/w3c/lua/test476.scxml b/test/w3c/lua/test476.scxml new file mode 100644 index 0000000..fcb7bd9 --- /dev/null +++ b/test/w3c/lua/test476.scxml @@ -0,0 +1,35 @@ + + + + + + + + + The Zen Mind + + + Freakonomics + + + + + + + + + + + + + 12334455 + some author + + + + + + + + + diff --git a/test/w3c/lua/test477.scxml b/test/w3c/lua/test477.scxml new file mode 100644 index 0000000..b9ebba9 --- /dev/null +++ b/test/w3c/lua/test477.scxml @@ -0,0 +1,35 @@ + + + + + + + + + The Zen Mind + + + Freakonomics + + + + + + + + + + + + + 12334455 + some author + + + + + + + + + diff --git a/test/w3c/lua/test478.scxml b/test/w3c/lua/test478.scxml new file mode 100644 index 0000000..d687487 --- /dev/null +++ b/test/w3c/lua/test478.scxml @@ -0,0 +1,34 @@ + + + + + + + + + The Zen Mind + + + Freakonomics + + + + + + + + + + + + + This is not a book + + + + + + + + + diff --git a/test/w3c/lua/test479.scxml b/test/w3c/lua/test479.scxml new file mode 100644 index 0000000..a26ae7b --- /dev/null +++ b/test/w3c/lua/test479.scxml @@ -0,0 +1,34 @@ + + + + + + + + + The Zen Mind + + + Freakonomics + + + + + + + + + + + + + This is not a book + + + + + + + + + diff --git a/test/w3c/lua/test480.scxml b/test/w3c/lua/test480.scxml new file mode 100644 index 0000000..866444f --- /dev/null +++ b/test/w3c/lua/test480.scxml @@ -0,0 +1,30 @@ + + + + + + + + + The Zen Mind + + + Freakonomics + + + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test481.scxml b/test/w3c/lua/test481.scxml new file mode 100644 index 0000000..930b60d --- /dev/null +++ b/test/w3c/lua/test481.scxml @@ -0,0 +1,35 @@ + + + + + + + + + The Zen Mind + + + Freakonomics + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test482.scxml b/test/w3c/lua/test482.scxml new file mode 100644 index 0000000..33b35a6 --- /dev/null +++ b/test/w3c/lua/test482.scxml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test483.scxml b/test/w3c/lua/test483.scxml new file mode 100644 index 0000000..375ca05 --- /dev/null +++ b/test/w3c/lua/test483.scxml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test487.scxml b/test/w3c/lua/test487.scxml new file mode 100644 index 0000000..95640c3 --- /dev/null +++ b/test/w3c/lua/test487.scxml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test488.scxml b/test/w3c/lua/test488.scxml new file mode 100644 index 0000000..69d0482 --- /dev/null +++ b/test/w3c/lua/test488.scxml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test495.scxml b/test/w3c/lua/test495.scxml new file mode 100644 index 0000000..bf317e5 --- /dev/null +++ b/test/w3c/lua/test495.scxml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test496.scxml b/test/w3c/lua/test496.scxml new file mode 100644 index 0000000..ab5a2c0 --- /dev/null +++ b/test/w3c/lua/test496.scxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/test/w3c/lua/test500.scxml b/test/w3c/lua/test500.scxml new file mode 100644 index 0000000..527d36d --- /dev/null +++ b/test/w3c/lua/test500.scxml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/test/w3c/lua/test501.scxml b/test/w3c/lua/test501.scxml new file mode 100644 index 0000000..d54f700 --- /dev/null +++ b/test/w3c/lua/test501.scxml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test503.scxml b/test/w3c/lua/test503.scxml new file mode 100644 index 0000000..1926776 --- /dev/null +++ b/test/w3c/lua/test503.scxml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test504.scxml b/test/w3c/lua/test504.scxml new file mode 100644 index 0000000..5b0011d --- /dev/null +++ b/test/w3c/lua/test504.scxml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test505.scxml b/test/w3c/lua/test505.scxml new file mode 100644 index 0000000..86da620 --- /dev/null +++ b/test/w3c/lua/test505.scxml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test506.scxml b/test/w3c/lua/test506.scxml new file mode 100644 index 0000000..0548023 --- /dev/null +++ b/test/w3c/lua/test506.scxml @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test509.scxml b/test/w3c/lua/test509.scxml new file mode 100644 index 0000000..8dd27c5 --- /dev/null +++ b/test/w3c/lua/test509.scxml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test510.scxml b/test/w3c/lua/test510.scxml new file mode 100644 index 0000000..2ccd802 --- /dev/null +++ b/test/w3c/lua/test510.scxml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test513.txt b/test/w3c/lua/test513.txt new file mode 100644 index 0000000..08e9b01 --- /dev/null +++ b/test/w3c/lua/test513.txt @@ -0,0 +1,16 @@ +This is a fully manual test. You send a well formed event to the 'location' URL + specified for your SCXML interpreter and check that you get a 200 response code back. + One way of doing this, using wget, is shown below (you can use any event name you + want, but you must use '_scxmleventname' to indicate the name of the event): + +$ wget \ +--post-data='key1=value1&key2=value2' \ +--header '_scxmleventname: test' \ + + +--2014-06-25 17:54:49-- http://epikur.local:8090/925c760f-2093-4054-a24c-d972d75f0dcd/basichttp +Resolving epikur.local (epikur.local)... 10.211.55.2, 10.37.129.2, 10.0.1.54, ... +Connecting to epikur.local (epikur.local)|10.211.55.2|:8090... connected. +HTTP request sent, awaiting response... 200 OK +Length: 0 [text/html] +Saving to: ‘basichttp’ \ No newline at end of file diff --git a/test/w3c/lua/test518.scxml b/test/w3c/lua/test518.scxml new file mode 100644 index 0000000..35b0db6 --- /dev/null +++ b/test/w3c/lua/test518.scxml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test519.scxml b/test/w3c/lua/test519.scxml new file mode 100644 index 0000000..0287f8a --- /dev/null +++ b/test/w3c/lua/test519.scxml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test520.scxml b/test/w3c/lua/test520.scxml new file mode 100644 index 0000000..2e2e356 --- /dev/null +++ b/test/w3c/lua/test520.scxml @@ -0,0 +1,19 @@ + + + + + + + + this is some content + + + + + + + + + + diff --git a/test/w3c/lua/test521.scxml b/test/w3c/lua/test521.scxml new file mode 100644 index 0000000..5c79990 --- /dev/null +++ b/test/w3c/lua/test521.scxml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test522.scxml b/test/w3c/lua/test522.scxml new file mode 100644 index 0000000..18db5f0 --- /dev/null +++ b/test/w3c/lua/test522.scxml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test525.scxml b/test/w3c/lua/test525.scxml new file mode 100644 index 0000000..5831767 --- /dev/null +++ b/test/w3c/lua/test525.scxml @@ -0,0 +1,22 @@ + + + + + {1,2,3} + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test527.scxml b/test/w3c/lua/test527.scxml new file mode 100644 index 0000000..79d17c5 --- /dev/null +++ b/test/w3c/lua/test527.scxml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test528.scxml b/test/w3c/lua/test528.scxml new file mode 100644 index 0000000..051cfd8 --- /dev/null +++ b/test/w3c/lua/test528.scxml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test529.scxml b/test/w3c/lua/test529.scxml new file mode 100644 index 0000000..ace3214 --- /dev/null +++ b/test/w3c/lua/test529.scxml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + 21 + + + + + + diff --git a/test/w3c/lua/test530.scxml b/test/w3c/lua/test530.scxml new file mode 100644 index 0000000..28c2047 --- /dev/null +++ b/test/w3c/lua/test530.scxml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test531.scxml b/test/w3c/lua/test531.scxml new file mode 100644 index 0000000..36d8301 --- /dev/null +++ b/test/w3c/lua/test531.scxml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test532.scxml b/test/w3c/lua/test532.scxml new file mode 100644 index 0000000..e9514a4 --- /dev/null +++ b/test/w3c/lua/test532.scxml @@ -0,0 +1,18 @@ + + + + + + + + + some content + + + + + + + + diff --git a/test/w3c/lua/test533.scxml b/test/w3c/lua/test533.scxml new file mode 100644 index 0000000..6407cfe --- /dev/null +++ b/test/w3c/lua/test533.scxml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test534.scxml b/test/w3c/lua/test534.scxml new file mode 100644 index 0000000..c206bc0 --- /dev/null +++ b/test/w3c/lua/test534.scxml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test537.scxml b/test/w3c/lua/test537.scxml new file mode 100644 index 0000000..a231a97 --- /dev/null +++ b/test/w3c/lua/test537.scxml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + diff --git a/test/w3c/lua/test539.scxml b/test/w3c/lua/test539.scxml new file mode 100644 index 0000000..fced2e6 --- /dev/null +++ b/test/w3c/lua/test539.scxml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test539.txt b/test/w3c/lua/test539.txt new file mode 100644 index 0000000..de1b0a1 --- /dev/null +++ b/test/w3c/lua/test539.txt @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/test/w3c/lua/test540.scxml b/test/w3c/lua/test540.scxml new file mode 100644 index 0000000..b0298b7 --- /dev/null +++ b/test/w3c/lua/test540.scxml @@ -0,0 +1,20 @@ + + + + + 123 +4 5 + + + + + + + + + + + + + diff --git a/test/w3c/lua/test540.txt b/test/w3c/lua/test540.txt new file mode 100644 index 0000000..2191239 --- /dev/null +++ b/test/w3c/lua/test540.txt @@ -0,0 +1,3 @@ +123 +4 5 + \ No newline at end of file diff --git a/test/w3c/lua/test542.scxml b/test/w3c/lua/test542.scxml new file mode 100644 index 0000000..69b6ea3 --- /dev/null +++ b/test/w3c/lua/test542.scxml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + 123 +4 5 + + + + + + + diff --git a/test/w3c/lua/test543.scxml b/test/w3c/lua/test543.scxml new file mode 100644 index 0000000..55946ed --- /dev/null +++ b/test/w3c/lua/test543.scxml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test544.scxml b/test/w3c/lua/test544.scxml new file mode 100644 index 0000000..5d935ab --- /dev/null +++ b/test/w3c/lua/test544.scxml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test545.scxml b/test/w3c/lua/test545.scxml new file mode 100644 index 0000000..7443ff2 --- /dev/null +++ b/test/w3c/lua/test545.scxml @@ -0,0 +1,19 @@ + + + + + + + + + 3 + + + + + + + + + + diff --git a/test/w3c/lua/test546.scxml b/test/w3c/lua/test546.scxml new file mode 100644 index 0000000..68efb84 --- /dev/null +++ b/test/w3c/lua/test546.scxml @@ -0,0 +1,15 @@ + + + + + + + some string + + + + + + + + diff --git a/test/w3c/lua/test547.scxml b/test/w3c/lua/test547.scxml new file mode 100644 index 0000000..26e5cc8 --- /dev/null +++ b/test/w3c/lua/test547.scxml @@ -0,0 +1,31 @@ + + + + + + + + + The Zen Mind + + + Freakonomics + + + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test550.scxml b/test/w3c/lua/test550.scxml new file mode 100644 index 0000000..93d514c --- /dev/null +++ b/test/w3c/lua/test550.scxml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test551.scxml b/test/w3c/lua/test551.scxml new file mode 100644 index 0000000..6836896 --- /dev/null +++ b/test/w3c/lua/test551.scxml @@ -0,0 +1,15 @@ + + + + + + + + + + {1,2,3} + + + + + diff --git a/test/w3c/lua/test552.scxml b/test/w3c/lua/test552.scxml new file mode 100644 index 0000000..154d60e --- /dev/null +++ b/test/w3c/lua/test552.scxml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + diff --git a/test/w3c/lua/test552.txt b/test/w3c/lua/test552.txt new file mode 100644 index 0000000..d8263ee --- /dev/null +++ b/test/w3c/lua/test552.txt @@ -0,0 +1 @@ +2 \ No newline at end of file diff --git a/test/w3c/lua/test553.scxml b/test/w3c/lua/test553.scxml new file mode 100644 index 0000000..cf926e7 --- /dev/null +++ b/test/w3c/lua/test553.scxml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test554.scxml b/test/w3c/lua/test554.scxml new file mode 100644 index 0000000..5c46992 --- /dev/null +++ b/test/w3c/lua/test554.scxml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test555.scxml b/test/w3c/lua/test555.scxml new file mode 100644 index 0000000..2609689 --- /dev/null +++ b/test/w3c/lua/test555.scxml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test557.scxml b/test/w3c/lua/test557.scxml new file mode 100644 index 0000000..bec74d0 --- /dev/null +++ b/test/w3c/lua/test557.scxml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test557.txt b/test/w3c/lua/test557.txt new file mode 100644 index 0000000..a8e51da --- /dev/null +++ b/test/w3c/lua/test557.txt @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/test/w3c/lua/test558.scxml b/test/w3c/lua/test558.scxml new file mode 100644 index 0000000..0ff6f90 --- /dev/null +++ b/test/w3c/lua/test558.scxml @@ -0,0 +1,22 @@ + + + + + +this is +a string + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test558.txt b/test/w3c/lua/test558.txt new file mode 100644 index 0000000..bb2bcc7 --- /dev/null +++ b/test/w3c/lua/test558.txt @@ -0,0 +1,3 @@ + +this is +a string \ No newline at end of file diff --git a/test/w3c/lua/test560.scxml b/test/w3c/lua/test560.scxml new file mode 100644 index 0000000..cb0d563 --- /dev/null +++ b/test/w3c/lua/test560.scxml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test561.scxml b/test/w3c/lua/test561.scxml new file mode 100644 index 0000000..77acad4 --- /dev/null +++ b/test/w3c/lua/test561.scxml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test562.scxml b/test/w3c/lua/test562.scxml new file mode 100644 index 0000000..99e86e5 --- /dev/null +++ b/test/w3c/lua/test562.scxml @@ -0,0 +1,19 @@ + + + + + + + +this is a +string + + + + + + + + + diff --git a/test/w3c/lua/test567.scxml b/test/w3c/lua/test567.scxml new file mode 100644 index 0000000..0e9b4ca --- /dev/null +++ b/test/w3c/lua/test567.scxml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test568.scxml b/test/w3c/lua/test568.scxml new file mode 100644 index 0000000..aaa1023 --- /dev/null +++ b/test/w3c/lua/test568.scxml @@ -0,0 +1,12 @@ + + + + + + + + + + diff --git a/test/w3c/lua/test569.scxml b/test/w3c/lua/test569.scxml new file mode 100644 index 0000000..ec6fe13 --- /dev/null +++ b/test/w3c/lua/test569.scxml @@ -0,0 +1,12 @@ + + + + + + + + + + diff --git a/test/w3c/lua/test570.scxml b/test/w3c/lua/test570.scxml new file mode 100644 index 0000000..659789e --- /dev/null +++ b/test/w3c/lua/test570.scxml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test576.scxml b/test/w3c/lua/test576.scxml new file mode 100644 index 0000000..195f3e4 --- /dev/null +++ b/test/w3c/lua/test576.scxml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test577.scxml b/test/w3c/lua/test577.scxml new file mode 100644 index 0000000..a652461 --- /dev/null +++ b/test/w3c/lua/test577.scxml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test578.scxml b/test/w3c/lua/test578.scxml new file mode 100644 index 0000000..8de6e25 --- /dev/null +++ b/test/w3c/lua/test578.scxml @@ -0,0 +1,16 @@ + + + + + + + { "productName" : "bar", "size" : 27 } + + + + + + + + diff --git a/test/w3c/lua/test579.scxml b/test/w3c/lua/test579.scxml new file mode 100644 index 0000000..b23ccbf --- /dev/null +++ b/test/w3c/lua/test579.scxml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/w3c/lua/test580.scxml b/test/w3c/lua/test580.scxml new file mode 100644 index 0000000..da066b3 --- /dev/null +++ b/test/w3c/lua/test580.scxml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + -- cgit v0.12