zeroc-ice 3.6.5 → 3.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (752) hide show
  1. checksums.yaml +4 -4
  2. data/BZIP2_LICENSE +42 -0
  3. data/ICE_LICENSE +17 -17
  4. data/LICENSE +12 -12
  5. data/bin/slice2rb +1 -1
  6. data/ext/Communicator.cpp +150 -53
  7. data/ext/Communicator.h +1 -1
  8. data/ext/Config.h +2 -12
  9. data/ext/Connection.cpp +89 -68
  10. data/ext/Connection.h +1 -1
  11. data/ext/Endpoint.cpp +16 -45
  12. data/ext/Endpoint.h +1 -1
  13. data/ext/ImplicitContext.cpp +1 -5
  14. data/ext/ImplicitContext.h +1 -1
  15. data/ext/Init.cpp +4 -1
  16. data/ext/Logger.cpp +1 -1
  17. data/ext/Logger.h +1 -1
  18. data/ext/Operation.cpp +33 -44
  19. data/ext/Operation.h +1 -1
  20. data/ext/Properties.cpp +1 -1
  21. data/ext/Properties.h +1 -1
  22. data/ext/Proxy.cpp +22 -57
  23. data/ext/Proxy.h +1 -1
  24. data/ext/Slice.cpp +5 -5
  25. data/ext/Slice.h +1 -1
  26. data/ext/Types.cpp +244 -171
  27. data/ext/Types.h +118 -66
  28. data/ext/Util.cpp +13 -9
  29. data/ext/Util.h +10 -10
  30. data/ext/ValueFactoryManager.cpp +445 -0
  31. data/ext/ValueFactoryManager.h +100 -0
  32. data/ext/extconf.rb +47 -45
  33. data/ext/ice/bzip2/blocksort.c +1094 -0
  34. data/ext/ice/bzip2/bzlib.c +1572 -0
  35. data/ext/ice/bzip2/bzlib.h +282 -0
  36. data/ext/ice/bzip2/bzlib_private.h +509 -0
  37. data/ext/ice/bzip2/compress.c +672 -0
  38. data/ext/ice/bzip2/crctable.c +104 -0
  39. data/ext/ice/bzip2/decompress.c +646 -0
  40. data/ext/ice/bzip2/huffman.c +205 -0
  41. data/ext/ice/bzip2/randtable.c +84 -0
  42. data/ext/ice/cpp/include/Ice/Application.h +77 -60
  43. data/ext/ice/cpp/include/Ice/AsyncResult.h +34 -318
  44. data/ext/ice/cpp/include/Ice/AsyncResultF.h +4 -2
  45. data/ext/ice/cpp/include/Ice/BatchRequestInterceptor.h +5 -10
  46. data/ext/ice/cpp/include/Ice/BatchRequestQueueF.h +1 -1
  47. data/ext/ice/cpp/include/Ice/Buffer.h +10 -10
  48. data/ext/ice/cpp/include/Ice/CommunicatorAsync.h +14 -12
  49. data/ext/ice/cpp/include/Ice/Comparable.h +130 -0
  50. data/ext/ice/cpp/include/Ice/Config.h +7 -36
  51. data/ext/ice/cpp/include/Ice/ConnectionAsync.h +107 -11
  52. data/ext/ice/cpp/include/Ice/ConnectionIF.h +5 -1
  53. data/ext/ice/cpp/include/Ice/ConsoleUtil.h +28 -0
  54. data/ext/ice/cpp/include/Ice/{DefaultObjectFactory.h → DefaultValueFactory.h} +28 -14
  55. data/ext/ice/cpp/include/Ice/DispatchInterceptor.h +4 -6
  56. data/ext/ice/cpp/include/Ice/Dispatcher.h +14 -13
  57. data/ext/ice/cpp/include/Ice/DynamicLibrary.h +7 -5
  58. data/ext/ice/cpp/include/Ice/DynamicLibraryF.h +1 -1
  59. data/ext/ice/cpp/include/Ice/Exception.h +66 -56
  60. data/ext/ice/cpp/include/Ice/ExceptionHelpers.h +69 -0
  61. data/ext/ice/cpp/include/Ice/FactoryTable.h +11 -12
  62. data/ext/ice/cpp/include/Ice/FactoryTableInit.h +27 -25
  63. data/ext/ice/cpp/include/Ice/Format.h +6 -1
  64. data/ext/ice/cpp/include/Ice/Functional.h +33 -33
  65. data/ext/ice/cpp/include/Ice/GCObject.h +9 -5
  66. data/ext/ice/cpp/include/Ice/Handle.h +6 -11
  67. data/ext/ice/cpp/include/Ice/Ice.h +9 -5
  68. data/ext/ice/cpp/include/{IceUtil → Ice}/IconvStringConverter.h +108 -62
  69. data/ext/ice/cpp/include/Ice/Incoming.h +109 -33
  70. data/ext/ice/cpp/include/Ice/IncomingAsync.h +63 -23
  71. data/ext/ice/cpp/include/Ice/IncomingAsyncF.h +7 -1
  72. data/ext/ice/cpp/include/Ice/Initialize.h +178 -38
  73. data/ext/ice/cpp/include/Ice/InputStream.h +994 -0
  74. data/ext/ice/cpp/include/Ice/InstanceF.h +1 -2
  75. data/ext/ice/cpp/include/Ice/InterfaceByValue.h +46 -0
  76. data/ext/ice/cpp/include/Ice/LocalObject.h +9 -9
  77. data/ext/ice/cpp/include/Ice/LocalObjectF.h +1 -1
  78. data/ext/ice/cpp/include/Ice/LoggerUtil.h +20 -14
  79. data/ext/ice/cpp/include/Ice/MetricsAdminI.h +114 -65
  80. data/ext/ice/cpp/include/Ice/MetricsFunctional.h +23 -5
  81. data/ext/ice/cpp/include/Ice/MetricsObserverI.h +99 -26
  82. data/ext/ice/cpp/include/Ice/NativePropertiesAdmin.h +17 -4
  83. data/ext/ice/cpp/include/Ice/Object.h +105 -56
  84. data/ext/ice/cpp/include/Ice/ObjectF.h +8 -3
  85. data/ext/ice/cpp/include/Ice/ObserverHelper.h +18 -8
  86. data/ext/ice/cpp/include/Ice/Optional.h +1084 -0
  87. data/ext/ice/cpp/include/Ice/OutgoingAsync.h +655 -84
  88. data/ext/ice/cpp/include/Ice/OutgoingAsyncF.h +12 -6
  89. data/ext/ice/cpp/include/Ice/OutputStream.h +753 -0
  90. data/ext/ice/cpp/include/Ice/Protocol.h +19 -12
  91. data/ext/ice/cpp/include/Ice/Proxy.h +1329 -717
  92. data/ext/ice/cpp/include/Ice/ProxyF.h +11 -33
  93. data/ext/ice/cpp/include/Ice/ProxyFactoryF.h +1 -1
  94. data/ext/ice/cpp/include/Ice/ProxyHandle.h +34 -50
  95. data/ext/ice/cpp/include/Ice/ReferenceF.h +1 -1
  96. data/ext/ice/cpp/include/Ice/RegisterPlugins.h +22 -3
  97. data/ext/ice/cpp/include/Ice/RequestHandlerF.h +10 -4
  98. data/ext/ice/cpp/include/Ice/ResponseHandlerF.h +6 -1
  99. data/ext/ice/cpp/include/{IceUtil → Ice}/SHA1.h +16 -16
  100. data/ext/ice/cpp/include/Ice/ServantManagerF.h +1 -1
  101. data/ext/ice/cpp/include/Ice/Service.h +13 -18
  102. data/ext/ice/cpp/include/Ice/SliceChecksums.h +1 -1
  103. data/ext/ice/cpp/include/Ice/SlicedData.h +46 -20
  104. data/ext/ice/cpp/include/Ice/SlicedDataF.h +14 -6
  105. data/ext/ice/cpp/include/Ice/StreamHelpers.h +159 -49
  106. data/ext/ice/cpp/include/Ice/StringConverter.h +52 -0
  107. data/ext/ice/cpp/include/Ice/ThreadPoolF.h +1 -1
  108. data/{slice/Ice/ObjectFactoryF.ice → ext/ice/cpp/include/Ice/UUID.h} +9 -7
  109. data/ext/ice/cpp/include/{IceUtil → Ice}/UniquePtr.h +21 -22
  110. data/ext/ice/cpp/include/Ice/UniqueRef.h +98 -0
  111. data/ext/ice/cpp/include/Ice/UserExceptionFactory.h +40 -8
  112. data/ext/ice/cpp/include/Ice/Value.h +104 -0
  113. data/{slice/Freeze/ConnectionF.ice → ext/ice/cpp/include/Ice/ValueF.h} +11 -7
  114. data/ext/ice/cpp/include/IceSSL/Config.h +8 -23
  115. data/ext/ice/cpp/include/IceSSL/IceSSL.h +17 -6
  116. data/ext/ice/cpp/include/IceSSL/OpenSSL.h +130 -0
  117. data/ext/ice/cpp/include/IceSSL/Plugin.h +172 -259
  118. data/ext/ice/cpp/include/IceSSL/SChannel.h +66 -0
  119. data/ext/ice/cpp/include/IceSSL/SecureTransport.h +66 -0
  120. data/ext/ice/cpp/include/IceSSL/UWP.h +58 -0
  121. data/ext/ice/cpp/include/IceUtil/Atomic.h +8 -10
  122. data/ext/ice/cpp/include/IceUtil/Cond.h +17 -18
  123. data/ext/ice/cpp/include/IceUtil/Config.h +138 -39
  124. data/ext/ice/cpp/include/IceUtil/ConsoleUtil.h +97 -0
  125. data/ext/ice/cpp/include/IceUtil/CountDownLatch.h +5 -5
  126. data/ext/ice/cpp/include/IceUtil/CtrlCHandler.h +23 -17
  127. data/ext/ice/cpp/include/IceUtil/DisableWarnings.h +1 -3
  128. data/ext/ice/cpp/include/IceUtil/Exception.h +157 -67
  129. data/ext/ice/cpp/include/IceUtil/FileUtil.h +148 -0
  130. data/ext/ice/cpp/include/IceUtil/Functional.h +1 -2
  131. data/ext/ice/cpp/include/IceUtil/Handle.h +11 -11
  132. data/ext/ice/cpp/include/IceUtil/IceUtil.h +4 -10
  133. data/ext/ice/cpp/include/IceUtil/InputUtil.h +3 -3
  134. data/ext/ice/cpp/include/IceUtil/Iterator.h +2 -2
  135. data/ext/ice/cpp/include/IceUtil/Lock.h +8 -10
  136. data/ext/ice/cpp/include/IceUtil/Monitor.h +1 -2
  137. data/ext/ice/cpp/include/IceUtil/Mutex.h +17 -11
  138. data/ext/ice/cpp/include/IceUtil/MutexProtocol.h +2 -2
  139. data/ext/ice/cpp/include/IceUtil/MutexPtrLock.h +4 -4
  140. data/ext/ice/cpp/include/IceUtil/MutexPtrTryLock.h +4 -4
  141. data/ext/ice/cpp/include/IceUtil/Optional.h +32 -18
  142. data/ext/ice/cpp/include/IceUtil/Options.h +17 -18
  143. data/ext/ice/cpp/include/IceUtil/OutputUtil.h +55 -29
  144. data/ext/ice/cpp/include/IceUtil/PopDisableWarnings.h +6 -6
  145. data/ext/ice/cpp/include/IceUtil/PushDisableWarnings.h +11 -10
  146. data/ext/ice/cpp/include/IceUtil/Random.h +3 -3
  147. data/ext/ice/cpp/include/IceUtil/RecMutex.h +7 -8
  148. data/ext/ice/cpp/include/IceUtil/ResourceConfig.h +58 -0
  149. data/ext/ice/cpp/include/IceUtil/ScannerConfig.h +1 -9
  150. data/ext/ice/cpp/include/IceUtil/ScopedArray.h +8 -2
  151. data/ext/ice/cpp/include/IceUtil/Shared.h +5 -7
  152. data/ext/ice/cpp/{src → include}/IceUtil/StopWatch.h +2 -2
  153. data/ext/ice/cpp/include/IceUtil/StringConverter.h +77 -72
  154. data/ext/ice/cpp/include/IceUtil/StringUtil.h +32 -21
  155. data/ext/ice/cpp/include/IceUtil/Thread.h +10 -12
  156. data/ext/ice/cpp/include/IceUtil/ThreadException.h +33 -42
  157. data/ext/ice/cpp/include/IceUtil/Time.h +3 -3
  158. data/ext/ice/cpp/include/IceUtil/Timer.h +14 -13
  159. data/ext/ice/cpp/include/IceUtil/UUID.h +2 -2
  160. data/ext/ice/cpp/include/IceUtil/UndefSysMacros.h +1 -1
  161. data/ext/ice/cpp/include/{Ice → generated/Ice}/BuiltinSequences.h +41 -8
  162. data/ext/ice/cpp/include/generated/Ice/Communicator.h +364 -0
  163. data/ext/ice/cpp/include/{Ice → generated/Ice}/CommunicatorF.h +40 -8
  164. data/ext/ice/cpp/include/generated/Ice/Connection.h +872 -0
  165. data/ext/ice/cpp/include/{Ice → generated/Ice}/ConnectionF.h +46 -8
  166. data/ext/ice/cpp/include/{Ice → generated/Ice}/Current.h +71 -8
  167. data/ext/ice/cpp/include/generated/Ice/Endpoint.h +582 -0
  168. data/ext/ice/cpp/include/{Ice → generated/Ice}/EndpointF.h +62 -8
  169. data/ext/ice/cpp/include/{Ice → generated/Ice}/EndpointTypes.h +31 -16
  170. data/ext/ice/cpp/include/{Ice → generated/Ice}/FacetMap.h +23 -8
  171. data/ext/ice/cpp/include/generated/Ice/Identity.h +221 -0
  172. data/ext/ice/cpp/include/{Ice → generated/Ice}/ImplicitContext.h +72 -13
  173. data/ext/ice/cpp/include/{Ice → generated/Ice}/ImplicitContextF.h +40 -8
  174. data/ext/ice/cpp/include/generated/Ice/Instrumentation.h +602 -0
  175. data/ext/ice/cpp/include/{Ice → generated/Ice}/InstrumentationF.h +54 -8
  176. data/ext/ice/cpp/include/generated/Ice/LocalException.h +2802 -0
  177. data/ext/ice/cpp/include/generated/Ice/Locator.h +2036 -0
  178. data/ext/ice/cpp/include/{Ice → generated/Ice}/LocatorF.h +53 -12
  179. data/ext/ice/cpp/include/{Ice → generated/Ice}/Logger.h +71 -13
  180. data/ext/ice/cpp/include/{Ice → generated/Ice}/LoggerF.h +40 -8
  181. data/ext/ice/cpp/include/generated/Ice/Metrics.h +2649 -0
  182. data/ext/ice/cpp/include/generated/Ice/ObjectAdapter.h +302 -0
  183. data/ext/ice/cpp/include/{Ice → generated/Ice}/ObjectAdapterF.h +40 -8
  184. data/ext/ice/cpp/include/generated/Ice/ObjectFactory.h +142 -0
  185. data/ext/ice/cpp/include/generated/Ice/Plugin.h +197 -0
  186. data/ext/ice/cpp/include/{Ice → generated/Ice}/PluginF.h +43 -8
  187. data/ext/ice/cpp/include/generated/Ice/Process.h +536 -0
  188. data/ext/ice/cpp/include/{Ice → generated/Ice}/ProcessF.h +45 -10
  189. data/ext/ice/cpp/include/{Ice → generated/Ice}/Properties.h +88 -21
  190. data/ext/ice/cpp/include/generated/Ice/PropertiesAdmin.h +749 -0
  191. data/ext/ice/cpp/include/{Ice → generated/Ice}/PropertiesF.h +48 -10
  192. data/ext/ice/cpp/include/generated/Ice/RemoteLogger.h +1449 -0
  193. data/ext/ice/cpp/include/generated/Ice/Router.h +1032 -0
  194. data/ext/ice/cpp/include/{Ice → generated/Ice}/RouterF.h +45 -10
  195. data/ext/ice/cpp/include/{Ice → generated/Ice}/ServantLocator.h +65 -13
  196. data/ext/ice/cpp/include/{Ice → generated/Ice}/ServantLocatorF.h +40 -8
  197. data/ext/ice/cpp/include/{Ice → generated/Ice}/SliceChecksumDict.h +23 -8
  198. data/ext/ice/cpp/include/generated/Ice/ValueFactory.h +169 -0
  199. data/ext/ice/cpp/include/generated/Ice/Version.h +334 -0
  200. data/ext/ice/cpp/include/generated/IceSSL/ConnectionInfo.h +172 -0
  201. data/ext/ice/cpp/include/generated/IceSSL/ConnectionInfoF.h +98 -0
  202. data/ext/ice/cpp/include/generated/IceSSL/EndpointInfo.h +156 -0
  203. data/ext/ice/cpp/src/Ice/ACM.cpp +18 -14
  204. data/ext/ice/cpp/src/Ice/ACM.h +9 -2
  205. data/ext/ice/cpp/{include → src}/Ice/ACMF.h +10 -5
  206. data/ext/ice/cpp/src/Ice/Acceptor.cpp +6 -1
  207. data/ext/ice/cpp/src/Ice/Acceptor.h +4 -3
  208. data/ext/ice/cpp/src/Ice/AcceptorF.h +1 -1
  209. data/ext/ice/cpp/src/{IceUtil → Ice}/ArgVector.cpp +9 -9
  210. data/ext/ice/cpp/src/{IceUtil → Ice}/ArgVector.h +7 -7
  211. data/ext/ice/cpp/src/Ice/AsyncResult.cpp +15 -538
  212. data/ext/ice/cpp/src/Ice/Base64.cpp +11 -11
  213. data/ext/ice/cpp/src/Ice/Base64.h +1 -1
  214. data/ext/ice/cpp/src/Ice/BatchRequestQueue.cpp +40 -12
  215. data/ext/ice/cpp/src/Ice/BatchRequestQueue.h +15 -10
  216. data/ext/ice/cpp/src/Ice/Buffer.cpp +74 -12
  217. data/ext/ice/cpp/src/Ice/BuiltinSequences.cpp +20 -6
  218. data/ext/ice/cpp/src/Ice/CollocatedRequestHandler.cpp +85 -190
  219. data/ext/ice/cpp/src/Ice/CollocatedRequestHandler.h +17 -18
  220. data/ext/ice/cpp/src/Ice/Communicator.cpp +39 -8
  221. data/ext/ice/cpp/src/Ice/CommunicatorF.cpp +27 -5
  222. data/ext/ice/cpp/src/Ice/CommunicatorI.cpp +271 -104
  223. data/ext/ice/cpp/src/Ice/CommunicatorI.h +84 -28
  224. data/ext/ice/cpp/src/{IceUtil → Ice}/Cond.cpp +3 -3
  225. data/ext/ice/cpp/src/Ice/ConnectRequestHandler.cpp +58 -125
  226. data/ext/ice/cpp/src/Ice/ConnectRequestHandler.h +11 -22
  227. data/ext/ice/cpp/src/Ice/ConnectRequestHandlerF.h +6 -2
  228. data/ext/ice/cpp/src/Ice/Connection.cpp +88 -8
  229. data/ext/ice/cpp/src/Ice/ConnectionF.cpp +27 -5
  230. data/ext/ice/cpp/src/Ice/ConnectionFactory.cpp +158 -80
  231. data/ext/ice/cpp/src/Ice/ConnectionFactory.h +41 -23
  232. data/ext/ice/cpp/{include → src}/Ice/ConnectionFactoryF.h +8 -3
  233. data/ext/ice/cpp/src/Ice/ConnectionI.cpp +707 -653
  234. data/ext/ice/cpp/src/Ice/ConnectionI.h +97 -69
  235. data/ext/ice/cpp/src/Ice/ConnectionRequestHandler.cpp +2 -15
  236. data/ext/ice/cpp/src/Ice/ConnectionRequestHandler.h +4 -3
  237. data/ext/ice/cpp/src/Ice/Connector.cpp +6 -1
  238. data/ext/ice/cpp/src/Ice/Connector.h +4 -3
  239. data/ext/ice/cpp/src/Ice/ConnectorF.h +1 -1
  240. data/ext/ice/cpp/src/{IceUtil → Ice}/CountDownLatch.cpp +4 -4
  241. data/ext/ice/cpp/src/Ice/Current.cpp +29 -6
  242. data/ext/ice/cpp/src/Ice/DefaultsAndOverrides.cpp +6 -5
  243. data/ext/ice/cpp/src/Ice/DefaultsAndOverrides.h +1 -1
  244. data/ext/ice/cpp/src/Ice/DefaultsAndOverridesF.h +1 -1
  245. data/ext/ice/cpp/src/Ice/DispatchInterceptor.cpp +5 -25
  246. data/ext/ice/cpp/src/Ice/DynamicLibrary.cpp +29 -19
  247. data/ext/ice/cpp/src/Ice/Endpoint.cpp +85 -6
  248. data/ext/ice/cpp/src/Ice/EndpointF.cpp +27 -5
  249. data/ext/ice/cpp/src/Ice/EndpointFactory.cpp +152 -1
  250. data/ext/ice/cpp/src/Ice/EndpointFactory.h +72 -6
  251. data/ext/ice/cpp/src/Ice/EndpointFactoryF.h +1 -1
  252. data/ext/ice/cpp/src/Ice/EndpointFactoryManager.cpp +35 -19
  253. data/ext/ice/cpp/src/Ice/EndpointFactoryManager.h +10 -4
  254. data/ext/ice/cpp/src/Ice/EndpointFactoryManagerF.h +1 -1
  255. data/ext/ice/cpp/src/Ice/EndpointI.cpp +17 -1
  256. data/ext/ice/cpp/src/Ice/EndpointI.h +35 -9
  257. data/ext/ice/cpp/src/Ice/EndpointIF.h +18 -5
  258. data/ext/ice/cpp/src/Ice/EndpointTypes.cpp +18 -6
  259. data/ext/ice/cpp/src/Ice/EventHandler.cpp +6 -4
  260. data/ext/ice/cpp/src/Ice/EventHandler.h +13 -8
  261. data/ext/ice/cpp/src/Ice/EventHandlerF.h +5 -2
  262. data/ext/ice/cpp/src/Ice/Exception.cpp +95 -86
  263. data/ext/ice/cpp/src/Ice/FacetMap.cpp +20 -6
  264. data/ext/ice/cpp/src/Ice/FactoryTable.cpp +37 -28
  265. data/ext/ice/cpp/src/Ice/FactoryTableInit.cpp +2 -4
  266. data/ext/ice/cpp/src/Ice/GCObject.cpp +28 -25
  267. data/ext/ice/cpp/src/Ice/HashUtil.h +2 -3
  268. data/ext/ice/cpp/src/Ice/HttpParser.cpp +1 -2
  269. data/ext/ice/cpp/src/Ice/HttpParser.h +1 -1
  270. data/ext/ice/cpp/src/Ice/IPEndpointI.cpp +92 -53
  271. data/ext/ice/cpp/src/Ice/IPEndpointI.h +19 -10
  272. data/ext/ice/cpp/src/Ice/IPEndpointIF.h +6 -2
  273. data/ext/ice/cpp/src/Ice/IconvStringConverter.cpp +56 -0
  274. data/ext/ice/cpp/src/Ice/Identity.cpp +24 -10
  275. data/ext/ice/cpp/src/Ice/ImplicitContext.cpp +37 -6
  276. data/ext/ice/cpp/src/Ice/ImplicitContextF.cpp +27 -5
  277. data/ext/ice/cpp/src/Ice/ImplicitContextI.cpp +14 -14
  278. data/ext/ice/cpp/src/Ice/ImplicitContextI.h +7 -5
  279. data/ext/ice/cpp/src/Ice/Incoming.cpp +276 -245
  280. data/ext/ice/cpp/src/Ice/IncomingAsync.cpp +104 -209
  281. data/ext/ice/cpp/src/Ice/IncomingRequest.h +5 -4
  282. data/ext/ice/cpp/src/Ice/Initialize.cpp +299 -172
  283. data/ext/ice/cpp/src/Ice/InputStream.cpp +2773 -0
  284. data/ext/ice/cpp/src/Ice/Instance.cpp +191 -231
  285. data/ext/ice/cpp/src/Ice/Instance.h +30 -18
  286. data/ext/ice/cpp/src/Ice/Instrumentation.cpp +106 -7
  287. data/ext/ice/cpp/src/Ice/InstrumentationF.cpp +27 -5
  288. data/ext/ice/cpp/src/Ice/InstrumentationI.cpp +117 -99
  289. data/ext/ice/cpp/src/Ice/InstrumentationI.h +30 -31
  290. data/ext/ice/cpp/src/Ice/LocalException.cpp +1190 -416
  291. data/ext/ice/cpp/src/Ice/LocalObject.cpp +1 -2
  292. data/ext/ice/cpp/src/Ice/Locator.cpp +1167 -1215
  293. data/ext/ice/cpp/src/Ice/LocatorF.cpp +29 -6
  294. data/ext/ice/cpp/src/Ice/LocatorInfo.cpp +129 -163
  295. data/ext/ice/cpp/src/Ice/LocatorInfo.h +29 -29
  296. data/ext/ice/cpp/src/Ice/LocatorInfoF.h +1 -1
  297. data/ext/ice/cpp/src/Ice/Logger.cpp +35 -5
  298. data/ext/ice/cpp/src/Ice/LoggerAdminI.cpp +178 -73
  299. data/ext/ice/cpp/src/Ice/LoggerAdminI.h +4 -4
  300. data/ext/ice/cpp/src/Ice/LoggerF.cpp +27 -5
  301. data/ext/ice/cpp/src/Ice/LoggerI.cpp +14 -44
  302. data/ext/ice/cpp/src/Ice/LoggerI.h +7 -13
  303. data/ext/ice/cpp/src/Ice/LoggerUtil.cpp +10 -12
  304. data/ext/ice/cpp/src/Ice/Metrics.cpp +1059 -1069
  305. data/ext/ice/cpp/src/Ice/MetricsAdminI.cpp +49 -19
  306. data/ext/ice/cpp/src/Ice/MetricsObserverI.cpp +1 -2
  307. data/ext/ice/cpp/src/Ice/Network.cpp +534 -170
  308. data/ext/ice/cpp/src/Ice/Network.h +100 -23
  309. data/ext/ice/cpp/src/Ice/NetworkF.h +2 -2
  310. data/ext/ice/cpp/src/Ice/NetworkProxy.cpp +21 -14
  311. data/ext/ice/cpp/src/Ice/NetworkProxy.h +5 -2
  312. data/ext/ice/cpp/src/Ice/NetworkProxyF.h +1 -1
  313. data/ext/ice/cpp/src/Ice/Object.cpp +217 -221
  314. data/ext/ice/cpp/src/Ice/ObjectAdapter.cpp +41 -6
  315. data/ext/ice/cpp/src/Ice/ObjectAdapterF.cpp +27 -5
  316. data/ext/ice/cpp/src/Ice/ObjectAdapterFactory.cpp +35 -14
  317. data/ext/ice/cpp/src/Ice/ObjectAdapterFactory.h +13 -7
  318. data/ext/ice/cpp/{include → src}/Ice/ObjectAdapterFactoryF.h +5 -1
  319. data/ext/ice/cpp/src/Ice/ObjectAdapterI.cpp +184 -58
  320. data/ext/ice/cpp/src/Ice/ObjectAdapterI.h +32 -26
  321. data/ext/ice/cpp/src/Ice/ObjectFactory.cpp +37 -6
  322. data/ext/ice/cpp/src/Ice/ObserverHelper.cpp +9 -32
  323. data/ext/ice/cpp/src/Ice/OpaqueEndpointI.cpp +40 -18
  324. data/ext/ice/cpp/src/Ice/OpaqueEndpointI.h +14 -5
  325. data/ext/ice/cpp/src/Ice/OutgoingAsync.cpp +803 -365
  326. data/ext/ice/cpp/src/Ice/OutputStream.cpp +1399 -0
  327. data/ext/ice/cpp/src/Ice/Plugin.cpp +45 -6
  328. data/ext/ice/cpp/src/Ice/PluginF.cpp +27 -5
  329. data/ext/ice/cpp/src/Ice/PluginManagerI.cpp +13 -13
  330. data/ext/ice/cpp/src/Ice/PluginManagerI.h +5 -6
  331. data/ext/ice/cpp/src/Ice/Process.cpp +256 -114
  332. data/ext/ice/cpp/src/Ice/ProcessF.cpp +29 -6
  333. data/ext/ice/cpp/src/Ice/Properties.cpp +38 -8
  334. data/ext/ice/cpp/src/Ice/PropertiesAdmin.cpp +340 -328
  335. data/ext/ice/cpp/src/Ice/PropertiesAdminI.cpp +81 -17
  336. data/ext/ice/cpp/src/Ice/PropertiesAdminI.h +29 -5
  337. data/ext/ice/cpp/src/Ice/PropertiesF.cpp +29 -6
  338. data/ext/ice/cpp/src/Ice/PropertiesI.cpp +25 -26
  339. data/ext/ice/cpp/src/Ice/PropertiesI.h +8 -11
  340. data/ext/ice/cpp/src/Ice/PropertyNames.cpp +107 -50
  341. data/ext/ice/cpp/src/Ice/PropertyNames.h +4 -2
  342. data/ext/ice/cpp/src/Ice/Protocol.cpp +2 -2
  343. data/ext/ice/cpp/src/Ice/ProtocolInstance.cpp +37 -2
  344. data/ext/ice/cpp/src/Ice/ProtocolInstance.h +9 -20
  345. data/ext/ice/cpp/src/Ice/ProtocolInstanceF.h +1 -1
  346. data/ext/ice/cpp/src/Ice/ProtocolPluginFacade.cpp +6 -1
  347. data/ext/ice/cpp/src/Ice/ProtocolPluginFacade.h +3 -1
  348. data/ext/ice/cpp/src/Ice/ProtocolPluginFacadeF.h +1 -1
  349. data/ext/ice/cpp/src/Ice/Proxy.cpp +690 -964
  350. data/ext/ice/cpp/src/Ice/ProxyFactory.cpp +23 -32
  351. data/ext/ice/cpp/src/Ice/ProxyFactory.h +16 -11
  352. data/ext/ice/cpp/src/Ice/Reference.cpp +75 -69
  353. data/ext/ice/cpp/src/Ice/Reference.h +27 -22
  354. data/ext/ice/cpp/src/Ice/ReferenceFactory.cpp +18 -21
  355. data/ext/ice/cpp/src/Ice/ReferenceFactory.h +12 -12
  356. data/ext/ice/cpp/src/Ice/ReferenceFactoryF.h +1 -1
  357. data/ext/ice/cpp/src/Ice/RegisterPluginsInit.cpp +18 -4
  358. data/ext/ice/cpp/src/Ice/RegisterPluginsInit.h +1 -1
  359. data/ext/ice/cpp/src/Ice/RemoteLogger.cpp +672 -552
  360. data/ext/ice/cpp/src/Ice/ReplyStatus.h +1 -1
  361. data/ext/ice/cpp/src/Ice/RequestHandler.cpp +5 -3
  362. data/ext/ice/cpp/src/Ice/RequestHandler.h +10 -13
  363. data/ext/ice/cpp/src/Ice/RequestHandlerFactory.cpp +10 -6
  364. data/ext/ice/cpp/src/Ice/RequestHandlerFactory.h +2 -2
  365. data/ext/ice/cpp/src/Ice/ResponseHandler.cpp +3 -6
  366. data/ext/ice/cpp/src/Ice/ResponseHandler.h +16 -7
  367. data/ext/ice/cpp/src/Ice/RetryQueue.cpp +6 -12
  368. data/ext/ice/cpp/src/Ice/RetryQueue.h +7 -6
  369. data/ext/ice/cpp/src/Ice/RetryQueueF.h +1 -1
  370. data/ext/ice/cpp/src/Ice/Router.cpp +523 -474
  371. data/ext/ice/cpp/src/Ice/RouterF.cpp +29 -6
  372. data/ext/ice/cpp/src/Ice/RouterInfo.cpp +91 -70
  373. data/ext/ice/cpp/src/Ice/RouterInfo.h +43 -32
  374. data/ext/ice/cpp/src/Ice/RouterInfoF.h +1 -1
  375. data/ext/ice/cpp/src/{IceUtil → Ice}/SHA1.cpp +21 -21
  376. data/ext/ice/cpp/src/Ice/Selector.cpp +989 -923
  377. data/ext/ice/cpp/src/Ice/Selector.h +100 -147
  378. data/ext/ice/cpp/src/Ice/ServantLocator.cpp +37 -6
  379. data/ext/ice/cpp/src/Ice/ServantLocatorF.cpp +27 -5
  380. data/ext/ice/cpp/src/Ice/ServantManager.cpp +9 -9
  381. data/ext/ice/cpp/src/Ice/ServantManager.h +1 -1
  382. data/ext/ice/cpp/src/Ice/SharedContext.h +2 -2
  383. data/ext/ice/cpp/src/Ice/SliceChecksumDict.cpp +20 -6
  384. data/ext/ice/cpp/src/Ice/SliceChecksums.cpp +2 -2
  385. data/ext/ice/cpp/src/Ice/SlicedData.cpp +72 -20
  386. data/ext/ice/cpp/src/Ice/StreamSocket.cpp +173 -18
  387. data/ext/ice/cpp/src/Ice/StreamSocket.h +13 -4
  388. data/ext/ice/cpp/src/Ice/StringConverterPlugin.cpp +48 -17
  389. data/ext/ice/cpp/src/Ice/StringUtil.h +35 -0
  390. data/ext/ice/cpp/src/Ice/SysLoggerI.cpp +8 -4
  391. data/ext/ice/cpp/src/Ice/SysLoggerI.h +2 -3
  392. data/ext/ice/cpp/src/Ice/TcpAcceptor.cpp +158 -32
  393. data/ext/ice/cpp/src/Ice/TcpAcceptor.h +12 -5
  394. data/ext/ice/cpp/src/Ice/TcpConnector.cpp +1 -7
  395. data/ext/ice/cpp/src/Ice/TcpConnector.h +1 -2
  396. data/ext/ice/cpp/src/Ice/TcpEndpointI.cpp +40 -32
  397. data/ext/ice/cpp/src/Ice/TcpEndpointI.h +11 -8
  398. data/ext/ice/cpp/src/Ice/TcpTransceiver.cpp +12 -27
  399. data/ext/ice/cpp/src/Ice/TcpTransceiver.h +7 -10
  400. data/ext/ice/cpp/src/{IceUtil → Ice}/Thread.cpp +24 -41
  401. data/ext/ice/cpp/src/Ice/ThreadPool.cpp +175 -267
  402. data/ext/ice/cpp/src/Ice/ThreadPool.h +38 -43
  403. data/ext/ice/cpp/src/{IceUtil → Ice}/Timer.cpp +28 -21
  404. data/ext/ice/cpp/src/Ice/TraceLevels.cpp +2 -2
  405. data/ext/ice/cpp/src/Ice/TraceLevels.h +1 -1
  406. data/ext/ice/cpp/src/Ice/TraceLevelsF.h +2 -2
  407. data/ext/ice/cpp/src/Ice/TraceUtil.cpp +53 -31
  408. data/ext/ice/cpp/src/Ice/TraceUtil.h +13 -6
  409. data/ext/ice/cpp/src/Ice/Transceiver.cpp +1 -2
  410. data/ext/ice/cpp/src/Ice/Transceiver.h +8 -7
  411. data/ext/ice/cpp/src/Ice/TransceiverF.h +1 -1
  412. data/ext/ice/cpp/src/Ice/UdpConnector.cpp +2 -8
  413. data/ext/ice/cpp/src/Ice/UdpConnector.h +1 -2
  414. data/ext/ice/cpp/src/Ice/UdpEndpointI.cpp +92 -31
  415. data/ext/ice/cpp/src/Ice/UdpEndpointI.h +12 -4
  416. data/ext/ice/cpp/src/Ice/UdpTransceiver.cpp +150 -179
  417. data/ext/ice/cpp/src/Ice/UdpTransceiver.h +15 -17
  418. data/ext/ice/cpp/src/Ice/Value.cpp +81 -0
  419. data/ext/ice/cpp/src/Ice/ValueFactory.cpp +84 -0
  420. data/ext/ice/cpp/src/Ice/ValueFactoryManagerI.cpp +70 -0
  421. data/ext/ice/cpp/src/Ice/ValueFactoryManagerI.h +42 -0
  422. data/ext/ice/cpp/src/Ice/Version.cpp +24 -14
  423. data/ext/ice/cpp/src/Ice/VirtualShared.h +43 -0
  424. data/ext/ice/cpp/src/Ice/WSAcceptor.cpp +3 -9
  425. data/ext/ice/cpp/src/Ice/WSAcceptor.h +3 -7
  426. data/ext/ice/cpp/src/Ice/WSConnector.cpp +5 -11
  427. data/ext/ice/cpp/src/Ice/WSConnector.h +3 -6
  428. data/ext/ice/cpp/src/Ice/WSEndpoint.cpp +185 -80
  429. data/ext/ice/cpp/src/Ice/WSEndpoint.h +21 -31
  430. data/ext/ice/cpp/src/Ice/WSTransceiver.cpp +41 -37
  431. data/ext/ice/cpp/src/Ice/WSTransceiver.h +7 -21
  432. data/ext/ice/cpp/src/IceDiscovery/IceDiscovery.cpp +526 -264
  433. data/ext/ice/cpp/src/IceDiscovery/IceDiscovery.h +341 -455
  434. data/ext/ice/cpp/src/IceDiscovery/LocatorI.cpp +86 -26
  435. data/ext/ice/cpp/src/IceDiscovery/LocatorI.h +59 -23
  436. data/ext/ice/cpp/src/IceDiscovery/LookupI.cpp +315 -61
  437. data/ext/ice/cpp/src/IceDiscovery/LookupI.h +83 -36
  438. data/ext/ice/cpp/src/IceDiscovery/PluginI.cpp +57 -59
  439. data/ext/ice/cpp/src/IceDiscovery/PluginI.h +3 -3
  440. data/ext/ice/cpp/src/IceLocatorDiscovery/IceLocatorDiscovery.cpp +396 -159
  441. data/ext/ice/cpp/src/IceLocatorDiscovery/IceLocatorDiscovery.h +251 -355
  442. data/ext/ice/cpp/src/IceLocatorDiscovery/Plugin.h +52 -0
  443. data/ext/ice/cpp/src/IceLocatorDiscovery/PluginI.cpp +526 -131
  444. data/ext/ice/cpp/src/IceSSL/AcceptorI.cpp +19 -165
  445. data/ext/ice/cpp/src/IceSSL/AcceptorI.h +8 -17
  446. data/ext/ice/cpp/src/IceSSL/CertificateI.cpp +284 -0
  447. data/ext/ice/cpp/src/IceSSL/CertificateI.h +69 -0
  448. data/ext/ice/cpp/src/IceSSL/ConnectionInfo.cpp +39 -11
  449. data/ext/ice/cpp/src/{Ice/ObjectFactoryF.cpp → IceSSL/ConnectionInfoF.cpp} +31 -9
  450. data/ext/ice/cpp/src/IceSSL/ConnectorI.cpp +14 -56
  451. data/ext/ice/cpp/src/IceSSL/ConnectorI.h +6 -13
  452. data/ext/ice/cpp/src/IceSSL/EndpointI.cpp +205 -197
  453. data/ext/ice/cpp/src/IceSSL/EndpointI.h +41 -33
  454. data/ext/ice/cpp/src/IceSSL/EndpointInfo.cpp +39 -10
  455. data/ext/ice/cpp/src/IceSSL/Instance.cpp +1 -6
  456. data/ext/ice/cpp/src/IceSSL/Instance.h +7 -7
  457. data/ext/ice/cpp/src/IceSSL/InstanceF.h +11 -7
  458. data/ext/ice/cpp/src/IceSSL/OpenSSLCertificateI.cpp +588 -0
  459. data/ext/ice/cpp/src/IceSSL/OpenSSLEngine.cpp +117 -152
  460. data/ext/ice/cpp/src/IceSSL/OpenSSLEngine.h +64 -0
  461. data/ext/ice/cpp/src/IceSSL/OpenSSLEngineF.h +32 -0
  462. data/ext/ice/cpp/src/IceSSL/OpenSSLPluginI.cpp +132 -0
  463. data/ext/ice/cpp/src/IceSSL/OpenSSLTransceiverI.cpp +400 -89
  464. data/ext/ice/cpp/src/IceSSL/OpenSSLTransceiverI.h +36 -21
  465. data/ext/ice/cpp/src/IceSSL/OpenSSLUtil.cpp +291 -0
  466. data/ext/ice/cpp/src/IceSSL/OpenSSLUtil.h +63 -0
  467. data/ext/ice/cpp/src/IceSSL/PluginI.cpp +71 -41
  468. data/ext/ice/cpp/src/IceSSL/PluginI.h +13 -18
  469. data/ext/ice/cpp/src/IceSSL/RFC2253.cpp +9 -54
  470. data/ext/ice/cpp/src/IceSSL/RFC2253.h +7 -7
  471. data/ext/ice/cpp/src/IceSSL/SChannelCertificateI.cpp +585 -0
  472. data/ext/ice/cpp/src/IceSSL/SChannelEngine.cpp +491 -75
  473. data/ext/ice/cpp/src/IceSSL/SChannelEngine.h +126 -0
  474. data/ext/ice/cpp/src/IceSSL/SChannelEngineF.h +32 -0
  475. data/ext/ice/cpp/src/IceSSL/SChannelPluginI.cpp +78 -0
  476. data/ext/ice/cpp/src/IceSSL/SChannelTransceiverI.cpp +126 -169
  477. data/ext/ice/cpp/src/IceSSL/SChannelTransceiverI.h +19 -22
  478. data/ext/ice/cpp/src/IceSSL/SSLEngine.cpp +79 -74
  479. data/ext/ice/cpp/src/IceSSL/SSLEngine.h +24 -187
  480. data/ext/ice/cpp/src/IceSSL/SSLEngineF.h +4 -19
  481. data/ext/ice/cpp/src/IceSSL/SecureTransportCertificateI.cpp +862 -0
  482. data/ext/ice/cpp/src/IceSSL/SecureTransportEngine.cpp +56 -214
  483. data/ext/ice/cpp/src/IceSSL/SecureTransportEngine.h +60 -0
  484. data/ext/ice/cpp/src/IceSSL/SecureTransportEngineF.h +31 -0
  485. data/ext/ice/cpp/src/IceSSL/SecureTransportPluginI.cpp +80 -0
  486. data/ext/ice/cpp/src/IceSSL/SecureTransportTransceiverI.cpp +137 -144
  487. data/ext/ice/cpp/src/IceSSL/SecureTransportTransceiverI.h +25 -28
  488. data/ext/ice/cpp/src/IceSSL/SecureTransportUtil.cpp +857 -0
  489. data/ext/ice/cpp/src/IceSSL/SecureTransportUtil.h +46 -0
  490. data/ext/ice/cpp/src/IceSSL/TrustManager.cpp +9 -13
  491. data/ext/ice/cpp/src/IceSSL/TrustManager.h +4 -4
  492. data/ext/ice/cpp/src/IceSSL/TrustManagerF.h +3 -3
  493. data/ext/ice/cpp/src/IceSSL/UWPCertificateI.cpp +271 -0
  494. data/ext/ice/cpp/src/IceSSL/UWPEngine.cpp +343 -0
  495. data/ext/ice/cpp/src/IceSSL/UWPEngine.h +46 -0
  496. data/ext/ice/cpp/{include/Ice/ObjectFactoryManagerF.h → src/IceSSL/UWPEngineF.h} +13 -8
  497. data/ext/ice/cpp/src/IceSSL/UWPPluginI.cpp +94 -0
  498. data/ext/ice/cpp/src/IceSSL/UWPTransceiverI.cpp +388 -0
  499. data/ext/ice/cpp/src/IceSSL/UWPTransceiverI.h +76 -0
  500. data/ext/ice/cpp/src/IceSSL/Util.cpp +66 -1256
  501. data/ext/ice/cpp/src/IceSSL/Util.h +48 -137
  502. data/ext/ice/cpp/src/IceUtil/ConsoleUtil.cpp +162 -0
  503. data/ext/ice/cpp/src/IceUtil/ConvertUTF.cpp +22 -22
  504. data/ext/ice/cpp/src/IceUtil/ConvertUTF.h +34 -26
  505. data/ext/ice/cpp/src/IceUtil/CtrlCHandler.cpp +20 -31
  506. data/ext/ice/cpp/src/IceUtil/FileUtil.cpp +25 -116
  507. data/ext/ice/cpp/src/IceUtil/InputUtil.cpp +1 -1
  508. data/ext/ice/cpp/src/IceUtil/MutexProtocol.cpp +1 -1
  509. data/ext/ice/cpp/src/IceUtil/Options.cpp +23 -46
  510. data/ext/ice/cpp/src/IceUtil/OutputUtil.cpp +7 -6
  511. data/ext/ice/cpp/src/IceUtil/Random.cpp +13 -13
  512. data/ext/ice/cpp/src/IceUtil/RecMutex.cpp +3 -9
  513. data/ext/ice/cpp/src/IceUtil/Shared.cpp +8 -3
  514. data/ext/ice/cpp/src/IceUtil/StringConverter.cpp +501 -264
  515. data/ext/ice/cpp/src/IceUtil/StringUtil.cpp +540 -235
  516. data/ext/ice/cpp/src/IceUtil/ThreadException.cpp +37 -74
  517. data/ext/ice/cpp/src/IceUtil/Time.cpp +1 -1
  518. data/ext/ice/cpp/src/IceUtil/UUID.cpp +10 -10
  519. data/ext/ice/cpp/src/IceUtil/Unicode.cpp +98 -97
  520. data/ext/ice/cpp/src/IceUtil/Unicode.h +21 -35
  521. data/ext/ice/cpp/src/IceUtil/UtilException.cpp +838 -0
  522. data/ext/ice/cpp/src/Slice/CPlusPlusUtil.cpp +815 -163
  523. data/ext/ice/cpp/src/Slice/CPlusPlusUtil.h +76 -0
  524. data/ext/ice/cpp/src/Slice/Checksum.cpp +2 -2
  525. data/ext/ice/cpp/{include → src}/Slice/Checksum.h +2 -2
  526. data/ext/ice/cpp/src/Slice/FileTracker.cpp +25 -78
  527. data/ext/ice/cpp/{include → src}/Slice/FileTracker.h +9 -9
  528. data/ext/ice/cpp/src/Slice/Grammar.cpp +1994 -1943
  529. data/ext/ice/cpp/src/Slice/Grammar.h +44 -24
  530. data/ext/ice/cpp/src/Slice/GrammarUtil.h +14 -14
  531. data/ext/ice/cpp/src/Slice/JavaUtil.cpp +2658 -1927
  532. data/ext/ice/cpp/{include → src}/Slice/JavaUtil.h +178 -59
  533. data/ext/ice/cpp/src/Slice/MD5.cpp +1 -1
  534. data/ext/ice/cpp/src/Slice/MD5.h +1 -1
  535. data/ext/ice/cpp/src/Slice/MD5I.cpp +0 -1
  536. data/ext/ice/cpp/src/Slice/MD5I.h +1 -1
  537. data/ext/ice/cpp/src/Slice/PHPUtil.cpp +12 -15
  538. data/ext/ice/cpp/{include → src}/Slice/PHPUtil.h +6 -15
  539. data/ext/ice/cpp/src/Slice/Parser.cpp +802 -307
  540. data/ext/ice/cpp/{include → src}/Slice/Parser.h +76 -84
  541. data/ext/ice/cpp/src/Slice/Preprocessor.cpp +43 -21
  542. data/ext/ice/cpp/{include → src}/Slice/Preprocessor.h +7 -12
  543. data/ext/ice/cpp/src/Slice/Python.cpp +207 -86
  544. data/ext/ice/cpp/src/Slice/PythonUtil.cpp +683 -679
  545. data/ext/ice/cpp/{include → src}/Slice/PythonUtil.h +19 -8
  546. data/ext/ice/cpp/src/Slice/Ruby.cpp +38 -34
  547. data/ext/ice/cpp/src/Slice/RubyUtil.cpp +177 -445
  548. data/ext/ice/cpp/{include → src}/Slice/RubyUtil.h +6 -6
  549. data/ext/ice/cpp/src/Slice/Scanner.cpp +218 -306
  550. data/ext/ice/cpp/src/Slice/{Util.cpp → SliceUtil.cpp} +37 -64
  551. data/ext/ice/cpp/src/Slice/StringLiteralUtil.cpp +374 -0
  552. data/ext/ice/cpp/src/Slice/Util.h +54 -0
  553. data/ext/ice/mcpp/Makefile +5 -2
  554. data/ice.gemspec +2 -7
  555. data/lib/Glacier2.rb +1 -1
  556. data/lib/Glacier2/Metrics.rb +7 -46
  557. data/lib/Glacier2/PermissionsVerifier.rb +24 -95
  558. data/lib/Glacier2/PermissionsVerifierF.rb +3 -3
  559. data/lib/Glacier2/Router.rb +32 -74
  560. data/lib/Glacier2/RouterF.rb +3 -3
  561. data/lib/Glacier2/SSLInfo.rb +4 -7
  562. data/lib/Glacier2/Session.rb +88 -307
  563. data/lib/Ice.rb +83 -52
  564. data/lib/Ice/BuiltinSequences.rb +4 -4
  565. data/lib/Ice/Communicator.rb +56 -58
  566. data/lib/Ice/CommunicatorF.rb +3 -3
  567. data/lib/Ice/Connection.rb +153 -162
  568. data/lib/Ice/ConnectionF.rb +3 -3
  569. data/lib/Ice/Current.rb +4 -11
  570. data/lib/Ice/Endpoint.rb +57 -133
  571. data/lib/Ice/EndpointF.rb +3 -3
  572. data/lib/Ice/EndpointTypes.rb +3 -7
  573. data/lib/Ice/FacetMap.rb +4 -4
  574. data/lib/Ice/Identity.rb +5 -8
  575. data/lib/Ice/ImplicitContext.rb +5 -34
  576. data/lib/Ice/ImplicitContextF.rb +3 -3
  577. data/lib/Ice/Instrumentation.rb +23 -275
  578. data/lib/Ice/InstrumentationF.rb +3 -3
  579. data/lib/Ice/LocalException.rb +95 -141
  580. data/lib/Ice/Locator.rb +51 -165
  581. data/lib/Ice/LocatorF.rb +3 -3
  582. data/lib/Ice/Logger.rb +5 -34
  583. data/lib/Ice/LoggerF.rb +3 -3
  584. data/lib/Ice/Metrics.rb +61 -416
  585. data/lib/Ice/ObjectAdapter.rb +34 -0
  586. data/lib/Ice/ObjectAdapterF.rb +3 -3
  587. data/lib/Ice/ObjectFactory.rb +5 -30
  588. data/lib/Ice/Plugin.rb +7 -60
  589. data/lib/Ice/PluginF.rb +3 -3
  590. data/lib/Ice/Process.rb +16 -52
  591. data/lib/Ice/ProcessF.rb +3 -3
  592. data/lib/Ice/Properties.rb +5 -41
  593. data/lib/Ice/PropertiesAdmin.rb +19 -56
  594. data/lib/Ice/PropertiesF.rb +3 -3
  595. data/lib/Ice/RemoteLogger.rb +34 -115
  596. data/lib/Ice/Router.rb +29 -101
  597. data/lib/Ice/RouterF.rb +3 -3
  598. data/lib/Ice/ServantLocator.rb +31 -0
  599. data/lib/Ice/{ObjectFactoryF.rb → ServantLocatorF.rb} +6 -6
  600. data/lib/Ice/SliceChecksumDict.rb +3 -3
  601. data/lib/Ice/ValueFactory.rb +33 -0
  602. data/lib/Ice/Version.rb +5 -11
  603. data/lib/IceBox.rb +1 -1
  604. data/lib/IceBox/IceBox.rb +44 -148
  605. data/lib/IceGrid.rb +1 -4
  606. data/lib/IceGrid/Admin.rb +551 -427
  607. data/lib/IceGrid/Descriptor.rb +62 -529
  608. data/lib/IceGrid/Exception.rb +24 -45
  609. data/lib/IceGrid/FileParser.rb +14 -50
  610. data/lib/IceGrid/PluginFacade.rb +40 -0
  611. data/lib/IceGrid/Registry.rb +151 -58
  612. data/lib/IceGrid/Session.rb +25 -64
  613. data/lib/IceGrid/UserAccountMapper.rb +14 -50
  614. data/lib/IcePatch2.rb +1 -1
  615. data/lib/IcePatch2/FileInfo.rb +5 -11
  616. data/lib/IcePatch2/FileServer.rb +33 -76
  617. data/lib/IceStorm.rb +1 -1
  618. data/lib/IceStorm/IceStorm.rb +79 -206
  619. data/lib/IceStorm/Metrics.rb +11 -89
  620. data/slice/Glacier2/Metrics.ice +8 -4
  621. data/slice/Glacier2/PermissionsVerifier.ice +10 -7
  622. data/slice/Glacier2/PermissionsVerifierF.ice +7 -4
  623. data/slice/Glacier2/Router.ice +10 -8
  624. data/slice/Glacier2/RouterF.ice +7 -4
  625. data/slice/Glacier2/SSLInfo.ice +8 -5
  626. data/slice/Glacier2/Session.ice +15 -13
  627. data/slice/Ice/BuiltinSequences.ice +7 -4
  628. data/slice/Ice/Communicator.ice +141 -66
  629. data/slice/Ice/CommunicatorF.ice +7 -4
  630. data/slice/Ice/Connection.ice +183 -86
  631. data/slice/Ice/ConnectionF.ice +7 -4
  632. data/slice/Ice/Current.ice +13 -9
  633. data/slice/Ice/Endpoint.ice +63 -14
  634. data/slice/Ice/EndpointF.ice +7 -4
  635. data/slice/Ice/EndpointTypes.ice +8 -6
  636. data/slice/Ice/FacetMap.ice +7 -4
  637. data/slice/Ice/Identity.ice +13 -5
  638. data/slice/Ice/ImplicitContext.ice +20 -18
  639. data/slice/Ice/ImplicitContextF.ice +7 -4
  640. data/slice/Ice/Instrumentation.ice +20 -19
  641. data/slice/Ice/InstrumentationF.ice +8 -5
  642. data/slice/Ice/LocalException.ice +87 -87
  643. data/slice/Ice/Locator.ice +19 -18
  644. data/slice/Ice/LocatorF.ice +7 -4
  645. data/slice/Ice/Logger.ice +9 -7
  646. data/slice/Ice/LoggerF.ice +7 -4
  647. data/slice/Ice/Metrics.ice +18 -14
  648. data/slice/Ice/ObjectAdapter.ice +30 -13
  649. data/slice/Ice/ObjectAdapterF.ice +7 -4
  650. data/slice/Ice/ObjectFactory.ice +15 -12
  651. data/slice/Ice/Plugin.ice +9 -6
  652. data/slice/Ice/PluginF.ice +8 -5
  653. data/slice/Ice/Process.ice +9 -6
  654. data/slice/Ice/ProcessF.ice +7 -4
  655. data/slice/Ice/Properties.ice +15 -12
  656. data/slice/Ice/PropertiesAdmin.ice +9 -5
  657. data/slice/Ice/PropertiesF.ice +7 -4
  658. data/slice/Ice/RemoteLogger.ice +33 -24
  659. data/slice/Ice/Router.ice +16 -7
  660. data/slice/Ice/RouterF.ice +7 -4
  661. data/slice/Ice/ServantLocator.ice +13 -10
  662. data/slice/Ice/ServantLocatorF.ice +7 -4
  663. data/slice/Ice/SliceChecksumDict.ice +7 -4
  664. data/slice/Ice/ValueFactory.ice +127 -0
  665. data/slice/Ice/Version.ice +9 -5
  666. data/slice/IceBT/ConnectionInfo.ice +53 -0
  667. data/slice/IceBT/EndpointInfo.ice +51 -0
  668. data/slice/IceBT/Types.ice +39 -0
  669. data/slice/IceBox/IceBox.ice +20 -21
  670. data/slice/IceDiscovery/IceDiscovery.ice +9 -5
  671. data/slice/IceGrid/Admin.ice +390 -30
  672. data/slice/IceGrid/Descriptor.ice +37 -29
  673. data/slice/IceGrid/Exception.ice +33 -27
  674. data/slice/IceGrid/FileParser.ice +9 -6
  675. data/slice/IceGrid/PluginFacade.ice +11 -9
  676. data/slice/IceGrid/Registry.ice +139 -16
  677. data/slice/IceGrid/Session.ice +10 -8
  678. data/slice/IceGrid/UserAccountMapper.ice +9 -6
  679. data/slice/IceIAP/ConnectionInfo.ice +70 -0
  680. data/slice/IceIAP/EndpointInfo.ice +64 -0
  681. data/slice/IceLocatorDiscovery/IceLocatorDiscovery.ice +9 -7
  682. data/slice/IcePatch2/FileInfo.ice +9 -8
  683. data/slice/IcePatch2/FileServer.ice +17 -13
  684. data/slice/IceSSL/ConnectionInfo.ice +14 -17
  685. data/slice/IceSSL/ConnectionInfoF.ice +24 -0
  686. data/slice/IceSSL/EndpointInfo.ice +9 -30
  687. data/slice/IceStorm/IceStorm.ice +22 -18
  688. data/slice/IceStorm/Metrics.ice +9 -5
  689. metadata +154 -120
  690. data/ext/ObjectFactory.cpp +0 -140
  691. data/ext/ObjectFactory.h +0 -50
  692. data/ext/ice/cpp/include/Ice/BasicStream.h +0 -1335
  693. data/ext/ice/cpp/include/Ice/Communicator.h +0 -200
  694. data/ext/ice/cpp/include/Ice/Connection.h +0 -497
  695. data/ext/ice/cpp/include/Ice/DeprecatedStringConverter.h +0 -62
  696. data/ext/ice/cpp/include/Ice/Endpoint.h +0 -341
  697. data/ext/ice/cpp/include/Ice/Identity.h +0 -168
  698. data/ext/ice/cpp/include/Ice/Instrumentation.h +0 -365
  699. data/ext/ice/cpp/include/Ice/LocalException.h +0 -1030
  700. data/ext/ice/cpp/include/Ice/Locator.h +0 -2193
  701. data/ext/ice/cpp/include/Ice/Metrics.h +0 -2974
  702. data/ext/ice/cpp/include/Ice/ObjectAdapter.h +0 -168
  703. data/ext/ice/cpp/include/Ice/ObjectFactory.h +0 -92
  704. data/ext/ice/cpp/include/Ice/ObjectFactoryF.h +0 -66
  705. data/ext/ice/cpp/include/Ice/Outgoing.h +0 -225
  706. data/ext/ice/cpp/include/Ice/Plugin.h +0 -125
  707. data/ext/ice/cpp/include/Ice/Process.h +0 -574
  708. data/ext/ice/cpp/include/Ice/PropertiesAdmin.h +0 -830
  709. data/ext/ice/cpp/include/Ice/RemoteLogger.h +0 -1500
  710. data/ext/ice/cpp/include/Ice/Router.h +0 -1159
  711. data/ext/ice/cpp/include/Ice/Stream.h +0 -447
  712. data/ext/ice/cpp/include/Ice/StreamF.h +0 -30
  713. data/ext/ice/cpp/include/Ice/Version.h +0 -262
  714. data/ext/ice/cpp/include/IceSSL/ConnectionInfo.h +0 -158
  715. data/ext/ice/cpp/include/IceSSL/EndpointInfo.h +0 -142
  716. data/ext/ice/cpp/include/IceUtil/AbstractMutex.h +0 -119
  717. data/ext/ice/cpp/include/IceUtil/Cache.h +0 -362
  718. data/ext/ice/cpp/include/Slice/CPlusPlusUtil.h +0 -65
  719. data/ext/ice/cpp/include/Slice/CsUtil.h +0 -92
  720. data/ext/ice/cpp/include/Slice/DotNetNames.h +0 -34
  721. data/ext/ice/cpp/include/Slice/ObjCUtil.h +0 -127
  722. data/ext/ice/cpp/include/Slice/Util.h +0 -56
  723. data/ext/ice/cpp/src/Ice/BasicStream.cpp +0 -3428
  724. data/ext/ice/cpp/src/Ice/DeprecatedStringConverter.cpp +0 -62
  725. data/ext/ice/cpp/src/Ice/ObjectFactoryManager.cpp +0 -139
  726. data/ext/ice/cpp/src/Ice/ObjectFactoryManager.h +0 -43
  727. data/ext/ice/cpp/src/Ice/Outgoing.cpp +0 -694
  728. data/ext/ice/cpp/src/Ice/Stream.cpp +0 -53
  729. data/ext/ice/cpp/src/Ice/StreamI.cpp +0 -832
  730. data/ext/ice/cpp/src/Ice/StreamI.h +0 -198
  731. data/ext/ice/cpp/src/IceSSL/Certificate.cpp +0 -1336
  732. data/ext/ice/cpp/src/IceUtil/Exception.cpp +0 -792
  733. data/ext/ice/cpp/src/IceUtil/FileUtil.h +0 -185
  734. data/ext/ice/cpp/src/Slice/CsUtil.cpp +0 -2660
  735. data/ext/ice/cpp/src/Slice/DotNetNames.cpp +0 -146
  736. data/ext/ice/cpp/src/Slice/ObjCUtil.cpp +0 -1310
  737. data/lib/IceGrid/Locator.rb +0 -106
  738. data/lib/IceGrid/Observer.rb +0 -572
  739. data/lib/IceGrid/Query.rb +0 -169
  740. data/slice/Freeze/BackgroundSaveEvictor.ice +0 -111
  741. data/slice/Freeze/CatalogData.ice +0 -49
  742. data/slice/Freeze/Connection.ice +0 -121
  743. data/slice/Freeze/DB.ice +0 -37
  744. data/slice/Freeze/Evictor.ice +0 -346
  745. data/slice/Freeze/EvictorF.ice +0 -22
  746. data/slice/Freeze/EvictorStorage.ice +0 -72
  747. data/slice/Freeze/Exception.ice +0 -100
  748. data/slice/Freeze/Transaction.ice +0 -58
  749. data/slice/Freeze/TransactionalEvictor.ice +0 -50
  750. data/slice/IceGrid/Locator.ice +0 -57
  751. data/slice/IceGrid/Observer.ice +0 -395
  752. data/slice/IceGrid/Query.ice +0 -131
@@ -1,6 +1,6 @@
1
1
  // **********************************************************************
2
2
  //
3
- // Copyright (c) 2003-2018 ZeroC, Inc. All rights reserved.
3
+ // Copyright (c) 2003-2017 ZeroC, Inc. All rights reserved.
4
4
  //
5
5
  // This copy of Ice is licensed to you under the terms described in the
6
6
  // ICE_LICENSE file included in this distribution.
@@ -63,6 +63,72 @@ filterOrderedOptionalDataMembers(const DataMemberList& members)
63
63
  return result;
64
64
  }
65
65
 
66
+ void
67
+ sortOptionalParameters(ParamDeclList& params)
68
+ {
69
+ //
70
+ // Sort optional parameters by tag.
71
+ //
72
+ class SortFn
73
+ {
74
+ public:
75
+ static bool compare(const ParamDeclPtr& lhs, const ParamDeclPtr& rhs)
76
+ {
77
+ return lhs->tag() < rhs->tag();
78
+ }
79
+ };
80
+ params.sort(SortFn::compare);
81
+ }
82
+
83
+ bool
84
+ isMutableAfterReturnType(const TypePtr& type)
85
+ {
86
+ //
87
+ // Returns true if the type contains data types which can be referenced by user code
88
+ // and mutated after a dispatch returns.
89
+ //
90
+
91
+ if(ClassDeclPtr::dynamicCast(type))
92
+ {
93
+ return true;
94
+ }
95
+
96
+ BuiltinPtr builtin = BuiltinPtr::dynamicCast(type);
97
+ if(builtin && (builtin->kind() == Builtin::KindObject || builtin->kind() == Builtin::KindValue))
98
+ {
99
+ return true;
100
+ }
101
+
102
+ if(SequencePtr::dynamicCast(type) || DictionaryPtr::dynamicCast(type))
103
+ {
104
+ return true;
105
+ }
106
+
107
+ StructPtr s = StructPtr::dynamicCast(type);
108
+ if(s)
109
+ {
110
+ return true;
111
+ }
112
+
113
+ return false;
114
+ }
115
+
116
+ void
117
+ checkDeprecatedType(const UnitPtr& unit, const TypePtr& type)
118
+ {
119
+ ClassDeclPtr decl = ClassDeclPtr::dynamicCast(type);
120
+ if(decl && !decl->isLocal() && decl->isInterface())
121
+ {
122
+ unit->warning(Deprecated, "interface by value is deprecated");
123
+ }
124
+
125
+ ProxyPtr proxy = ProxyPtr::dynamicCast(type);
126
+ if(proxy && !proxy->_class()->isInterface())
127
+ {
128
+ unit->warning(Deprecated, "proxy for a class is deprecated");
129
+ }
130
+ }
131
+
66
132
  }
67
133
 
68
134
  namespace Slice
@@ -79,6 +145,7 @@ Unit* unit;
79
145
  Slice::DefinitionContext::DefinitionContext(int includeLevel, const StringList& metaData) :
80
146
  _includeLevel(includeLevel), _metaData(metaData), _seenDefinition(false)
81
147
  {
148
+ initSuppressedWarnings();
82
149
  }
83
150
 
84
151
  string
@@ -121,6 +188,7 @@ void
121
188
  Slice::DefinitionContext::setMetaData(const StringList& metaData)
122
189
  {
123
190
  _metaData = metaData;
191
+ initSuppressedWarnings();
124
192
  }
125
193
 
126
194
  string
@@ -143,6 +211,74 @@ Slice::DefinitionContext::getMetaData() const
143
211
  return _metaData;
144
212
  }
145
213
 
214
+ void
215
+ Slice::DefinitionContext::warning(WarningCategory category, const string& file, int line, const string& msg) const
216
+ {
217
+ if(!suppressWarning(category))
218
+ {
219
+ emitWarning(file, line, msg);
220
+ }
221
+ }
222
+
223
+ void
224
+ Slice::DefinitionContext::warning(WarningCategory category, const string& file, const string& line, const string& msg) const
225
+ {
226
+ if(!suppressWarning(category))
227
+ {
228
+ emitWarning(file, line, msg);
229
+ }
230
+ }
231
+
232
+ bool
233
+ Slice::DefinitionContext::suppressWarning(WarningCategory category) const
234
+ {
235
+ return _suppressedWarnings.find(category) != _suppressedWarnings.end() ||
236
+ _suppressedWarnings.find(All) != _suppressedWarnings.end();
237
+ }
238
+
239
+ void
240
+ Slice::DefinitionContext::initSuppressedWarnings()
241
+ {
242
+ _suppressedWarnings.clear();
243
+ const string prefix = "suppress-warning";
244
+ string value = findMetaData(prefix);
245
+ if(value == prefix)
246
+ {
247
+ _suppressedWarnings.insert(All);
248
+ }
249
+ else if(!value.empty())
250
+ {
251
+ assert(value.length() > prefix.length());
252
+ if(value[prefix.length()] == ':')
253
+ {
254
+ value = value.substr(prefix.length() + 1);
255
+ vector<string> result;
256
+ IceUtilInternal::splitString(value, ",", result);
257
+ for(vector<string>::iterator p = result.begin(); p != result.end(); ++p)
258
+ {
259
+ string s = IceUtilInternal::trim(*p);
260
+ if(s == "all")
261
+ {
262
+ _suppressedWarnings.insert(All);
263
+ }
264
+ else if(s == "deprecated")
265
+ {
266
+ _suppressedWarnings.insert(Deprecated);
267
+ }
268
+ else if(s == "invalid-metadata")
269
+ {
270
+ _suppressedWarnings.insert(InvalidMetaData);
271
+ }
272
+ else
273
+ {
274
+ warning(InvalidMetaData, "", "", string("invalid category `") + s +
275
+ "' in global metadata suppress-warning");
276
+ }
277
+ }
278
+ }
279
+ }
280
+ }
281
+
146
282
  // ----------------------------------------------------------------------
147
283
  // SyntaxTreeBase
148
284
  // ----------------------------------------------------------------------
@@ -258,6 +394,11 @@ Slice::Builtin::typeId() const
258
394
  return "::Ice::LocalObject";
259
395
  break;
260
396
  }
397
+ case KindValue:
398
+ {
399
+ return "::Ice::Value";
400
+ break;
401
+ }
261
402
  }
262
403
  assert(false);
263
404
  return ""; // Keep the compiler happy.
@@ -266,7 +407,7 @@ Slice::Builtin::typeId() const
266
407
  bool
267
408
  Slice::Builtin::usesClasses() const
268
409
  {
269
- return _kind == KindObject;
410
+ return _kind == KindObject || _kind == KindValue;
270
411
  }
271
412
 
272
413
  size_t
@@ -283,7 +424,8 @@ Slice::Builtin::minWireSize() const
283
424
  8, // KindDouble
284
425
  1, // KindString: at least one byte for an empty string.
285
426
  1, // KindObject: at least one byte (to marshal an index instead of an instance).
286
- 2 // KindObjectProxy: at least an empty identity for a nil proxy, that is, 2 bytes.
427
+ 2, // KindObjectProxy: at least an empty identity for a nil proxy, that is, 2 bytes.
428
+ 1 // KindValue: at least one byte (to marshal an index instead of an instance).
287
429
  };
288
430
 
289
431
  assert(_kind != KindLocalObject);
@@ -293,7 +435,7 @@ Slice::Builtin::minWireSize() const
293
435
  bool
294
436
  Slice::Builtin::isVariableLength() const
295
437
  {
296
- return _kind == KindString || _kind == KindObject || _kind == KindObjectProxy;
438
+ return _kind == KindString || _kind == KindObject || _kind == KindObjectProxy || _kind == KindValue;
297
439
  }
298
440
 
299
441
  Builtin::Kind
@@ -320,7 +462,8 @@ const char* Slice::Builtin::builtinTable[] =
320
462
  "string",
321
463
  "Object",
322
464
  "Object*",
323
- "LocalObject"
465
+ "LocalObject",
466
+ "Value"
324
467
  };
325
468
 
326
469
  Slice::Builtin::Builtin(const UnitPtr& unit, Kind kind) :
@@ -368,12 +511,13 @@ string
368
511
  Slice::Contained::flattenedScope() const
369
512
  {
370
513
  string s = scope();
371
- string flattenedScope;
372
- for(string::const_iterator r = s.begin(); r != s.end(); ++r)
514
+ string::size_type pos = 0;
515
+ while((pos = s.find("::", pos)) != string::npos)
373
516
  {
374
- flattenedScope += ((*r) == ':') ? '_' : *r;
517
+ s.replace(pos, 2, "_");
518
+
375
519
  }
376
- return flattenedScope;
520
+ return s;
377
521
  }
378
522
 
379
523
  string
@@ -496,12 +640,6 @@ Slice::Contained::operator==(const Contained& rhs) const
496
640
  return _scoped == rhs._scoped;
497
641
  }
498
642
 
499
- bool
500
- Slice::Contained::operator!=(const Contained& rhs) const
501
- {
502
- return _scoped != rhs._scoped;
503
- }
504
-
505
643
  Slice::Contained::Contained(const ContainerPtr& container, const string& name) :
506
644
  SyntaxTreeBase(container->unit()),
507
645
  _container(container),
@@ -876,17 +1014,6 @@ Slice::Container::createSequence(const string& name, const TypePtr& type, const
876
1014
  {
877
1015
  checkIdentifier(name);
878
1016
 
879
- if(_unit->profile() == IceE && !local)
880
- {
881
- BuiltinPtr builtin = BuiltinPtr::dynamicCast(type);
882
- if((builtin && builtin->kind() == Builtin::KindObject) || ClassDeclPtr::dynamicCast(type))
883
- {
884
- string msg = "Sequence `" + name + "' cannot contain object values.";
885
- _unit->error(msg);
886
- return 0;
887
- }
888
- }
889
-
890
1017
  ContainedList matches = _unit->findContents(thisScope() + name);
891
1018
  if(!matches.empty())
892
1019
  {
@@ -930,6 +1057,8 @@ Slice::Container::createSequence(const string& name, const TypePtr& type, const
930
1057
  _unit->error(msg);
931
1058
  }
932
1059
 
1060
+ checkDeprecatedType(_unit, type);
1061
+
933
1062
  SequencePtr p = new Sequence(this, name, type, metaData, local);
934
1063
  _contents.push_back(p);
935
1064
  return p;
@@ -942,17 +1071,6 @@ Slice::Container::createDictionary(const string& name, const TypePtr& keyType, c
942
1071
  {
943
1072
  checkIdentifier(name);
944
1073
 
945
- if(_unit->profile() == IceE && !local)
946
- {
947
- BuiltinPtr builtin = BuiltinPtr::dynamicCast(valueType);
948
- if((builtin && builtin->kind() == Builtin::KindObject) || ClassDeclPtr::dynamicCast(valueType))
949
- {
950
- string msg = "Dictionary `" + name + "' cannot contain object values.";
951
- _unit->error(msg);
952
- return 0;
953
- }
954
- }
955
-
956
1074
  ContainedList matches = _unit->findContents(thisScope() + name);
957
1075
  if(!matches.empty())
958
1076
  {
@@ -997,7 +1115,7 @@ Slice::Container::createDictionary(const string& name, const TypePtr& keyType, c
997
1115
  }
998
1116
  if(containsSequence)
999
1117
  {
1000
- _unit->warning("use of sequences in dictionary keys has been deprecated");
1118
+ _unit->warning(Deprecated, "use of sequences in dictionary keys has been deprecated");
1001
1119
  }
1002
1120
  }
1003
1121
 
@@ -1015,6 +1133,8 @@ Slice::Container::createDictionary(const string& name, const TypePtr& keyType, c
1015
1133
  }
1016
1134
  }
1017
1135
 
1136
+ checkDeprecatedType(_unit, valueType);
1137
+
1018
1138
  DictionaryPtr p = new Dictionary(this, name, keyType, keyMetaData, valueType, valueMetaData, local);
1019
1139
  _contents.push_back(p);
1020
1140
  return p;
@@ -1068,13 +1188,11 @@ EnumeratorPtr
1068
1188
  Slice::Container::createEnumerator(const string& name)
1069
1189
  {
1070
1190
  EnumeratorPtr p = validateEnumerator(name);
1071
- if(p)
1191
+ if(!p)
1072
1192
  {
1073
- return p;
1193
+ p = new Enumerator(this, name);
1194
+ _contents.push_back(p);
1074
1195
  }
1075
-
1076
- p = new Enumerator(this, name);
1077
- _contents.push_back(p);
1078
1196
  return p;
1079
1197
  }
1080
1198
 
@@ -1082,13 +1200,11 @@ EnumeratorPtr
1082
1200
  Slice::Container::createEnumerator(const string& name, int value)
1083
1201
  {
1084
1202
  EnumeratorPtr p = validateEnumerator(name);
1085
- if(p)
1203
+ if(!p)
1086
1204
  {
1087
- return p;
1205
+ p = new Enumerator(this, name, value);
1206
+ _contents.push_back(p);
1088
1207
  }
1089
-
1090
- p = new Enumerator(this, name, value);
1091
- _contents.push_back(p);
1092
1208
  return p;
1093
1209
  }
1094
1210
 
@@ -1133,15 +1249,17 @@ Slice::Container::createConst(const string name, const TypePtr& constType, const
1133
1249
  checkForGlobalDef(name, "constant"); // Don't return here -- we create the constant anyway.
1134
1250
  }
1135
1251
 
1252
+ SyntaxTreeBasePtr resolvedValueType = valueType;
1253
+
1136
1254
  //
1137
- // Validate the constant and its value.
1255
+ // Validate the constant and its value; for enums, find enumerator
1138
1256
  //
1139
- if(nt == Real && !validateConstant(name, constType, valueType, value, true))
1257
+ if(nt == Real && !validateConstant(name, constType, resolvedValueType, value, true))
1140
1258
  {
1141
1259
  return 0;
1142
1260
  }
1143
1261
 
1144
- ConstPtr p = new Const(this, name, constType, metaData, valueType, value, literal);
1262
+ ConstPtr p = new Const(this, name, constType, metaData, resolvedValueType, value, literal);
1145
1263
  _contents.push_back(p);
1146
1264
  return p;
1147
1265
  }
@@ -1178,16 +1296,8 @@ Slice::Container::lookupType(const string& scoped, bool printError)
1178
1296
  return lookupTypeNoBuiltin(scoped, printError);
1179
1297
  }
1180
1298
 
1181
- //
1182
- // TODO: Hack to keep binary compatibility with Ice 3.6.0, fix properly in Ice 3.7
1183
- //
1184
- namespace
1185
- {
1186
- bool ignoreUndefined = false;
1187
- }
1188
-
1189
1299
  TypeList
1190
- Slice::Container::lookupTypeNoBuiltin(const string& scoped, bool printError)
1300
+ Slice::Container::lookupTypeNoBuiltin(const string& scoped, bool printError, bool ignoreUndefined)
1191
1301
  {
1192
1302
  //
1193
1303
  // Remove whitespace.
@@ -1304,12 +1414,7 @@ Slice::Container::lookupTypeNoBuiltin(const string& scoped, bool printError)
1304
1414
  ContainedPtr contained = ContainedPtr::dynamicCast(this);
1305
1415
  if(contained)
1306
1416
  {
1307
- if(typeError)
1308
- {
1309
- ignoreUndefined = true;
1310
- }
1311
- results = contained->container()->lookupTypeNoBuiltin(sc, printError);
1312
- ignoreUndefined = false;
1417
+ results = contained->container()->lookupTypeNoBuiltin(sc, printError, typeError || ignoreUndefined);
1313
1418
  }
1314
1419
  else if(!typeError)
1315
1420
  {
@@ -1433,7 +1538,6 @@ Slice::Container::unit() const
1433
1538
  return SyntaxTreeBase::unit();
1434
1539
  }
1435
1540
 
1436
-
1437
1541
  ModuleList
1438
1542
  Slice::Container::modules() const
1439
1543
  {
@@ -1539,6 +1643,86 @@ Slice::Container::enums() const
1539
1643
  return result;
1540
1644
  }
1541
1645
 
1646
+ EnumeratorList
1647
+ Slice::Container::enumerators() const
1648
+ {
1649
+ EnumeratorList result;
1650
+ for(ContainedList::const_iterator p = _contents.begin(); p != _contents.end(); ++p)
1651
+ {
1652
+ EnumeratorPtr q = EnumeratorPtr::dynamicCast(*p);
1653
+ if(q)
1654
+ {
1655
+ result.push_back(q);
1656
+ }
1657
+ }
1658
+ return result;
1659
+ }
1660
+
1661
+ //
1662
+ // Find enumerators using the old unscoped enumerators lookup
1663
+ //
1664
+ EnumeratorList
1665
+ Slice::Container::enumerators(const string& scoped) const
1666
+ {
1667
+ EnumeratorList result;
1668
+ string::size_type lastColon = scoped.rfind(':');
1669
+
1670
+ if(lastColon == string::npos)
1671
+ {
1672
+ // check all enclosing scopes
1673
+ ContainerPtr container = const_cast<Container*>(this);
1674
+ do
1675
+ {
1676
+ EnumList enums = container->enums();
1677
+ for(EnumList::iterator p = enums.begin(); p != enums.end(); ++p)
1678
+ {
1679
+ ContainedList cl = (*p)->lookupContained(scoped, false);
1680
+ if(!cl.empty())
1681
+ {
1682
+ result.push_back(EnumeratorPtr::dynamicCast(cl.front()));
1683
+ }
1684
+ }
1685
+
1686
+ ContainedPtr contained = ContainedPtr::dynamicCast(container);
1687
+ if(contained)
1688
+ {
1689
+ container = contained->container();
1690
+ }
1691
+ else
1692
+ {
1693
+ container = 0;
1694
+ }
1695
+ }
1696
+ while(result.empty() && container);
1697
+ }
1698
+ else
1699
+ {
1700
+ // Find the referenced scope
1701
+ ContainerPtr container = const_cast<Container*>(this);
1702
+ string scope = scoped.substr(0, scoped.rfind("::"));
1703
+ ContainedList cl = container->lookupContained(scope, false);
1704
+ if(!cl.empty())
1705
+ {
1706
+ container = ContainerPtr::dynamicCast(cl.front());
1707
+ if(container)
1708
+ {
1709
+ EnumList enums = container->enums();
1710
+ string name = scoped.substr(lastColon + 1);
1711
+ for(EnumList::iterator p = enums.begin(); p != enums.end(); ++p)
1712
+ {
1713
+ ContainedList cl = (*p)->lookupContained(name, false);
1714
+ if(!cl.empty())
1715
+ {
1716
+ result.push_back(EnumeratorPtr::dynamicCast(cl.front()));
1717
+ }
1718
+ }
1719
+ }
1720
+ }
1721
+ }
1722
+
1723
+ return result;
1724
+ }
1725
+
1542
1726
  ConstList
1543
1727
  Slice::Container::consts() const
1544
1728
  {
@@ -1610,7 +1794,7 @@ Slice::Container::hasLocalClassDefsWithAsync() const
1610
1794
  ClassDefPtr cl = ClassDefPtr::dynamicCast(*p);
1611
1795
  if(cl && cl->isLocal())
1612
1796
  {
1613
- if(cl->hasMetaData("async"))
1797
+ if(cl->hasMetaData("async-oneway"))
1614
1798
  {
1615
1799
  return true;
1616
1800
  }
@@ -1618,7 +1802,7 @@ Slice::Container::hasLocalClassDefsWithAsync() const
1618
1802
  OperationList ol = cl->operations();
1619
1803
  for(OperationList::const_iterator q = ol.begin(); q != ol.end(); ++q)
1620
1804
  {
1621
- if((*q)->hasMetaData("async"))
1805
+ if((*q)->hasMetaData("async-oneway"))
1622
1806
  {
1623
1807
  return true;
1624
1808
  }
@@ -1677,7 +1861,47 @@ Slice::Container::hasNonLocalExceptions() const
1677
1861
  return false;
1678
1862
  }
1679
1863
 
1864
+ bool
1865
+ Slice::Container::hasStructs() const
1866
+ {
1867
+ for(ContainedList::const_iterator p = _contents.begin(); p != _contents.end(); ++p)
1868
+ {
1869
+ StructPtr q = StructPtr::dynamicCast(*p);
1870
+ if(q)
1871
+ {
1872
+ return true;
1873
+ }
1874
+
1875
+ ContainerPtr container = ContainerPtr::dynamicCast(*p);
1876
+ if(container && container->hasStructs())
1877
+ {
1878
+ return true;
1879
+ }
1880
+ }
1881
+
1882
+ return false;
1883
+ }
1884
+
1885
+ bool
1886
+ Slice::Container::hasExceptions() const
1887
+ {
1888
+ for(ContainedList::const_iterator p = _contents.begin(); p != _contents.end(); ++p)
1889
+ {
1890
+ ExceptionPtr q = ExceptionPtr::dynamicCast(*p);
1891
+ if(q)
1892
+ {
1893
+ return true;
1894
+ }
1895
+
1896
+ ContainerPtr container = ContainerPtr::dynamicCast(*p);
1897
+ if(container && container->hasExceptions())
1898
+ {
1899
+ return true;
1900
+ }
1901
+ }
1680
1902
 
1903
+ return false;
1904
+ }
1681
1905
 
1682
1906
  bool
1683
1907
  Slice::Container::hasClassDecls() const
@@ -1774,6 +1998,66 @@ Slice::Container::hasClassDefs() const
1774
1998
  return false;
1775
1999
  }
1776
2000
 
2001
+ bool
2002
+ Slice::Container::hasLocalClassDefs() const
2003
+ {
2004
+ for(ContainedList::const_iterator p = _contents.begin(); p != _contents.end(); ++p)
2005
+ {
2006
+ ClassDefPtr cl = ClassDefPtr::dynamicCast(*p);
2007
+ if(cl && cl->isLocal())
2008
+ {
2009
+ return true;
2010
+ }
2011
+
2012
+ ContainerPtr container = ContainerPtr::dynamicCast(*p);
2013
+ if(container && container->hasLocalClassDefs())
2014
+ {
2015
+ return true;
2016
+ }
2017
+ }
2018
+ return false;
2019
+ }
2020
+
2021
+ bool
2022
+ Slice::Container::hasNonLocalInterfaceDefs() const
2023
+ {
2024
+ for(ContainedList::const_iterator p = _contents.begin(); p != _contents.end(); ++p)
2025
+ {
2026
+ ClassDefPtr cl = ClassDefPtr::dynamicCast(*p);
2027
+ if(cl && !cl->isLocal() && (cl->isInterface() || !cl->allOperations().empty()))
2028
+ {
2029
+ return true;
2030
+ }
2031
+
2032
+ ContainerPtr container = ContainerPtr::dynamicCast(*p);
2033
+ if(container && container->hasNonLocalInterfaceDefs())
2034
+ {
2035
+ return true;
2036
+ }
2037
+ }
2038
+ return false;
2039
+ }
2040
+
2041
+ bool
2042
+ Slice::Container::hasValueDefs() const
2043
+ {
2044
+ for(ContainedList::const_iterator p = _contents.begin(); p != _contents.end(); ++p)
2045
+ {
2046
+ ClassDefPtr cl = ClassDefPtr::dynamicCast(*p);
2047
+ if(cl && !cl->isLocal() && !cl->isInterface())
2048
+ {
2049
+ return true;
2050
+ }
2051
+
2052
+ ContainerPtr container = ContainerPtr::dynamicCast(*p);
2053
+ if(container && container->hasValueDefs())
2054
+ {
2055
+ return true;
2056
+ }
2057
+ }
2058
+ return false;
2059
+ }
2060
+
1777
2061
  bool
1778
2062
  Slice::Container::hasOnlyClassDecls() const
1779
2063
  {
@@ -2001,7 +2285,7 @@ Slice::Container::mergeModules()
2001
2285
  metaData2.unique();
2002
2286
  if(!checkGlobalMetaData(metaData1, metaData2))
2003
2287
  {
2004
- unit()->warning("global metadata mismatch for module `" + mod1->name() + "' in files " +
2288
+ unit()->warning(All, "global metadata mismatch for module `" + mod1->name() + "' in files " +
2005
2289
  dc1->filename() + " and " + dc2->filename());
2006
2290
  }
2007
2291
 
@@ -2310,23 +2594,34 @@ Slice::Container::checkIdentifier(const string& name) const
2310
2594
  //
2311
2595
  // For rules controlled by a translator option, we don't complain about included files.
2312
2596
  //
2313
- _unit->error("illegal underscore in identifier `" + name + "'");
2597
+
2598
+ DefinitionContextPtr dc = _unit->currentDefinitionContext();
2599
+ assert(dc);
2600
+ if(dc->findMetaData("underscore") != "underscore") // no "underscore" global metadata
2601
+ {
2602
+ _unit->error("illegal underscore in identifier `" + name + "'");
2603
+ }
2314
2604
  }
2315
2605
 
2606
+ //
2607
+ // For rules controlled by a translator option, we don't complain about included files.
2608
+ //
2316
2609
  if(_unit->currentIncludeLevel() == 0 && !_unit->allowIcePrefix())
2317
2610
  {
2318
- //
2319
- // For rules controlled by a translator option, we don't complain about included files.
2320
- //
2321
- if(name.size() >= 3)
2611
+ DefinitionContextPtr dc = _unit->currentDefinitionContext();
2612
+ assert(dc);
2613
+ if(dc->findMetaData("ice-prefix") != "ice-prefix") // no "ice-prefix" global metadata
2322
2614
  {
2323
- string prefix3;
2324
- prefix3 += ::tolower(static_cast<unsigned char>(name[0]));
2325
- prefix3 += ::tolower(static_cast<unsigned char>(name[1]));
2326
- prefix3 += ::tolower(static_cast<unsigned char>(name[2]));
2327
- if(prefix3 == "ice")
2615
+ if(name.size() >= 3)
2328
2616
  {
2329
- _unit->error("illegal identifier `" + name + "': `" + name.substr(0, 3) + "' prefix is reserved");
2617
+ string prefix3;
2618
+ prefix3 += ::tolower(static_cast<unsigned char>(name[0]));
2619
+ prefix3 += ::tolower(static_cast<unsigned char>(name[1]));
2620
+ prefix3 += ::tolower(static_cast<unsigned char>(name[2]));
2621
+ if(prefix3 == "ice")
2622
+ {
2623
+ _unit->error("illegal identifier `" + name + "': `" + name.substr(0, 3) + "' prefix is reserved");
2624
+ }
2330
2625
  }
2331
2626
  }
2332
2627
  }
@@ -2429,7 +2724,7 @@ Slice::Container::checkGlobalMetaData(const StringList& m1, const StringList& m2
2429
2724
  }
2430
2725
 
2431
2726
  bool
2432
- Slice::Container::validateConstant(const string& name, const TypePtr& type, const SyntaxTreeBasePtr& valueType,
2727
+ Slice::Container::validateConstant(const string& name, const TypePtr& type, SyntaxTreeBasePtr& valueType,
2433
2728
  const string& value, bool isConstant)
2434
2729
  {
2435
2730
  //
@@ -2575,6 +2870,7 @@ Slice::Container::validateConstant(const string& name, const TypePtr& type, cons
2575
2870
  case Builtin::KindObject:
2576
2871
  case Builtin::KindObjectProxy:
2577
2872
  case Builtin::KindLocalObject:
2873
+ case Builtin::KindValue:
2578
2874
  {
2579
2875
  assert(false);
2580
2876
  break;
@@ -2657,20 +2953,57 @@ Slice::Container::validateConstant(const string& name, const TypePtr& type, cons
2657
2953
  }
2658
2954
  else
2659
2955
  {
2660
- EnumeratorPtr lte = EnumeratorPtr::dynamicCast(valueType);
2661
-
2662
- if(!lte)
2956
+ if(valueType)
2663
2957
  {
2664
- string msg = "type of initializer is incompatible with the type of " + desc + " `" + name + "'";
2665
- _unit->error(msg);
2666
- return false;
2958
+ EnumeratorPtr lte = EnumeratorPtr::dynamicCast(valueType);
2959
+
2960
+ if(!lte)
2961
+ {
2962
+ string msg = "type of initializer is incompatible with the type of " + desc + " `" + name + "'";
2963
+ _unit->error(msg);
2964
+ return false;
2965
+ }
2966
+ EnumeratorList elist = e->enumerators();
2967
+ if(find(elist.begin(), elist.end(), lte) == elist.end())
2968
+ {
2969
+ string msg = "enumerator `" + value + "' is not defined in enumeration `" + e->scoped() + "'";
2970
+ _unit->error(msg);
2971
+ return false;
2972
+ }
2667
2973
  }
2668
- EnumeratorList elist = e->getEnumerators();
2669
- if(find(elist.begin(), elist.end(), lte) == elist.end())
2974
+ else
2670
2975
  {
2671
- string msg = "enumerator `" + value + "' is not defined in enumeration `" + e->scoped() + "'";
2672
- _unit->error(msg);
2673
- return false;
2976
+ // Check if value designates an enumerator of e
2977
+ string newVal = value;
2978
+ string::size_type lastColon = value.rfind(':');
2979
+ if(lastColon != string::npos && lastColon + 1 < value.length())
2980
+ {
2981
+ newVal = value.substr(0, lastColon + 1) + e->name() + "::" + value.substr(lastColon + 1);
2982
+ }
2983
+
2984
+ ContainedList clist = e->lookupContained(newVal, false);
2985
+ if(clist.empty())
2986
+ {
2987
+ string msg = "`" + value + "' does not designate an enumerator of `" + e->scoped() + "'";
2988
+ _unit->error(msg);
2989
+ return false;
2990
+ }
2991
+ EnumeratorPtr lte = EnumeratorPtr::dynamicCast(clist.front());
2992
+ if(lte)
2993
+ {
2994
+ valueType = lte;
2995
+ if(lastColon != string::npos)
2996
+ {
2997
+ _unit->warning(Deprecated, string("referencing enumerator `") + lte->name() +
2998
+ "' in its enumeration's enclosing scope is deprecated");
2999
+ }
3000
+ }
3001
+ else
3002
+ {
3003
+ string msg = "type of initializer is incompatible with the type of " + desc + " `" + name + "'";
3004
+ _unit->error(msg);
3005
+ return false;
3006
+ }
2674
3007
  }
2675
3008
  }
2676
3009
  }
@@ -2697,20 +3030,17 @@ Slice::Container::validateEnumerator(const string& name)
2697
3030
  }
2698
3031
  if(matches.front()->name() == name)
2699
3032
  {
2700
- string msg = "redefinition of " + matches.front()->kindOf() + " `" + matches.front()->name();
2701
- msg += "' as enumerator";
2702
- _unit->error(msg);
3033
+ _unit->error(string("redefinition of enumerator `") + name + "'");
2703
3034
  }
2704
3035
  else
2705
3036
  {
2706
3037
  string msg = "enumerator `" + name + "' differs only in capitalization from ";
2707
- msg += matches.front()->kindOf() + " `" + matches.front()->name() + "'";
3038
+ msg += "`" + matches.front()->name() + "'";
2708
3039
  _unit->error(msg);
2709
3040
  }
2710
3041
  }
2711
3042
 
2712
- nameIsLegal(name, "enumerator"); // Don't return here -- we create the enumerator anyway.
2713
-
3043
+ nameIsLegal(name, "enumerator"); // Ignore return value.
2714
3044
  return 0;
2715
3045
  }
2716
3046
 
@@ -3186,6 +3516,12 @@ Slice::ClassDef::createOperation(const string& name,
3186
3516
  _unit->error(msg);
3187
3517
  }
3188
3518
 
3519
+ if(!isInterface() && !isLocal() && !_hasOperations)
3520
+ {
3521
+ // Only warn for the first operation
3522
+ _unit->warning(Deprecated, "classes with operations are deprecated");
3523
+ }
3524
+
3189
3525
  _hasOperations = true;
3190
3526
  OperationPtr op = new Operation(this, name, returnType, optional, tag, mode);
3191
3527
  _contents.push_back(op);
@@ -3199,28 +3535,6 @@ Slice::ClassDef::createDataMember(const string& name, const TypePtr& type, bool
3199
3535
  {
3200
3536
  checkIdentifier(name);
3201
3537
 
3202
- if(_unit->profile() == IceE)
3203
- {
3204
- if(!isLocal())
3205
- {
3206
- BuiltinPtr builtin = BuiltinPtr::dynamicCast(type);
3207
- if((builtin && builtin->kind() == Builtin::KindObject))
3208
- {
3209
- string msg = "Class data member `" + name + "' cannot be a value object.";
3210
- _unit->error(msg);
3211
- return 0;
3212
- }
3213
-
3214
- ClassDeclPtr classDecl = ClassDeclPtr::dynamicCast(type);
3215
- if(classDecl != 0 && !classDecl->isLocal())
3216
- {
3217
- string msg = "Class data member `" + name + "' cannot be a value object.";
3218
- _unit->error(msg);
3219
- return 0;
3220
- }
3221
- }
3222
- }
3223
-
3224
3538
  assert(!isInterface());
3225
3539
  ContainedList matches = _unit->findContents(thisScope() + name);
3226
3540
  if(!matches.empty())
@@ -3303,7 +3617,7 @@ Slice::ClassDef::createDataMember(const string& name, const TypePtr& type, bool
3303
3617
  string dv = defaultValue;
3304
3618
  string dl = defaultLiteral;
3305
3619
 
3306
- if(dlt)
3620
+ if(dlt || (EnumPtr::dynamicCast(type) && !dv.empty()))
3307
3621
  {
3308
3622
  //
3309
3623
  // Validate the default value.
@@ -3336,6 +3650,8 @@ Slice::ClassDef::createDataMember(const string& name, const TypePtr& type, bool
3336
3650
  }
3337
3651
  }
3338
3652
 
3653
+ checkDeprecatedType(_unit, type);
3654
+
3339
3655
  _hasDataMembers = true;
3340
3656
  DataMemberPtr member = new DataMember(this, name, type, optional, tag, dlt, dv, dl);
3341
3657
  _contents.push_back(member);
@@ -3456,7 +3772,9 @@ Slice::ClassDef::classDataMembers() const
3456
3772
  if(q)
3457
3773
  {
3458
3774
  BuiltinPtr builtin = BuiltinPtr::dynamicCast(q->type());
3459
- if((builtin && builtin->kind() == Builtin::KindObject) || ClassDeclPtr::dynamicCast(q->type()))
3775
+ if((builtin && builtin->kind() == Builtin::KindObject) ||
3776
+ (builtin && builtin->kind() == Builtin::KindValue) ||
3777
+ ClassDeclPtr::dynamicCast(q->type()))
3460
3778
  {
3461
3779
  result.push_back(q);
3462
3780
  }
@@ -3603,6 +3921,17 @@ Slice::ClassDef::inheritsMetaData(const string& meta) const
3603
3921
  return false;
3604
3922
  }
3605
3923
 
3924
+ bool
3925
+ Slice::ClassDef::hasBaseDataMembers() const
3926
+ {
3927
+ if(!_bases.empty() && !_bases.front()->isInterface())
3928
+ {
3929
+ return !_bases.front()->allDataMembers().empty();
3930
+ }
3931
+
3932
+ return false;
3933
+ }
3934
+
3606
3935
  Contained::ContainedType
3607
3936
  Slice::ClassDef::containedType() const
3608
3937
  {
@@ -3645,6 +3974,11 @@ Slice::ClassDef::compactId() const
3645
3974
  return _compactId;
3646
3975
  }
3647
3976
 
3977
+ bool
3978
+ Slice::ClassDef::isDelegate() const
3979
+ {
3980
+ return isLocal() && isInterface() && hasMetaData("delegate") && allOperations().size() == 1;
3981
+ }
3648
3982
  Slice::ClassDef::ClassDef(const ContainerPtr& container, const string& name, int id, bool intf, const ClassList& bases,
3649
3983
  bool local) :
3650
3984
  SyntaxTreeBase(container->unit()),
@@ -3657,6 +3991,17 @@ Slice::ClassDef::ClassDef(const ContainerPtr& container, const string& name, int
3657
3991
  _local(local),
3658
3992
  _compactId(id)
3659
3993
  {
3994
+ if(!local && !intf)
3995
+ {
3996
+ for(ClassList::const_iterator p = _bases.begin(); p != _bases.end(); ++p)
3997
+ {
3998
+ if((*p)->isInterface())
3999
+ {
4000
+ _unit->warning(Deprecated, "classes implementing interfaces are deprecated");
4001
+ break;
4002
+ }
4003
+ }
4004
+ }
3660
4005
  //
3661
4006
  // First element of bases may be a class, all others must be
3662
4007
  // interfaces.
@@ -3681,13 +4026,13 @@ Slice::ClassDef::ClassDef(const ContainerPtr& container, const string& name, int
3681
4026
  bool
3682
4027
  Slice::Proxy::isLocal() const
3683
4028
  {
3684
- return __class->isLocal();
4029
+ return _classDecl->isLocal();
3685
4030
  }
3686
4031
 
3687
4032
  string
3688
4033
  Slice::Proxy::typeId() const
3689
4034
  {
3690
- return __class->scoped();
4035
+ return _classDecl->scoped();
3691
4036
  }
3692
4037
 
3693
4038
  bool
@@ -3711,13 +4056,13 @@ Slice::Proxy::isVariableLength() const
3711
4056
  ClassDeclPtr
3712
4057
  Slice::Proxy::_class() const
3713
4058
  {
3714
- return __class;
4059
+ return _classDecl;
3715
4060
  }
3716
4061
 
3717
4062
  Slice::Proxy::Proxy(const ClassDeclPtr& cl) :
3718
4063
  SyntaxTreeBase(cl->unit()),
3719
4064
  Type(cl->unit()),
3720
- __class(cl)
4065
+ _classDecl(cl)
3721
4066
  {
3722
4067
  }
3723
4068
 
@@ -3739,28 +4084,6 @@ Slice::Exception::createDataMember(const string& name, const TypePtr& type, bool
3739
4084
  {
3740
4085
  checkIdentifier(name);
3741
4086
 
3742
- if(_unit->profile() == IceE)
3743
- {
3744
- if(!isLocal())
3745
- {
3746
- BuiltinPtr builtin = BuiltinPtr::dynamicCast(type);
3747
- if((builtin && builtin->kind() == Builtin::KindObject))
3748
- {
3749
- string msg = "Exception data member `" + name + "' cannot be a value object.";
3750
- _unit->error(msg);
3751
- return 0;
3752
- }
3753
-
3754
- ClassDeclPtr classDecl = ClassDeclPtr::dynamicCast(type);
3755
- if(classDecl != 0 && !classDecl->isLocal())
3756
- {
3757
- string msg = "Exception data member `" + name + "' cannot be a value object.";
3758
- _unit->error(msg);
3759
- return 0;
3760
- }
3761
- }
3762
- }
3763
-
3764
4087
  ContainedList matches = _unit->findContents(thisScope() + name);
3765
4088
  if(!matches.empty())
3766
4089
  {
@@ -3830,7 +4153,7 @@ Slice::Exception::createDataMember(const string& name, const TypePtr& type, bool
3830
4153
  string dv = defaultValue;
3831
4154
  string dl = defaultLiteral;
3832
4155
 
3833
- if(dlt)
4156
+ if(dlt || (EnumPtr::dynamicCast(type) && !dv.empty()))
3834
4157
  {
3835
4158
  //
3836
4159
  // Validate the default value.
@@ -3863,6 +4186,8 @@ Slice::Exception::createDataMember(const string& name, const TypePtr& type, bool
3863
4186
  }
3864
4187
  }
3865
4188
 
4189
+ checkDeprecatedType(_unit, type);
4190
+
3866
4191
  DataMemberPtr p = new DataMember(this, name, type, optional, tag, dlt, dv, dl);
3867
4192
  _contents.push_back(p);
3868
4193
  return p;
@@ -3925,7 +4250,9 @@ Slice::Exception::classDataMembers() const
3925
4250
  if(q)
3926
4251
  {
3927
4252
  BuiltinPtr builtin = BuiltinPtr::dynamicCast(q->type());
3928
- if((builtin && builtin->kind() == Builtin::KindObject) || ClassDeclPtr::dynamicCast(q->type()))
4253
+ if((builtin && builtin->kind() == Builtin::KindObject) ||
4254
+ (builtin && builtin->kind() == Builtin::KindValue) ||
4255
+ ClassDeclPtr::dynamicCast(q->type()))
3929
4256
  {
3930
4257
  result.push_back(q);
3931
4258
  }
@@ -4059,6 +4386,12 @@ Slice::Exception::inheritsMetaData(const string& meta) const
4059
4386
  return false;
4060
4387
  }
4061
4388
 
4389
+ bool
4390
+ Slice::Exception::hasBaseDataMembers() const
4391
+ {
4392
+ return _base && !_base->allDataMembers().empty();
4393
+ }
4394
+
4062
4395
  string
4063
4396
  Slice::Exception::kindOf() const
4064
4397
  {
@@ -4093,29 +4426,6 @@ Slice::Struct::createDataMember(const string& name, const TypePtr& type, bool op
4093
4426
  const SyntaxTreeBasePtr& defaultValueType, const string& defaultValue,
4094
4427
  const string& defaultLiteral)
4095
4428
  {
4096
- checkIdentifier(name);
4097
-
4098
- if(_unit->profile() == IceE)
4099
- {
4100
- if(!isLocal())
4101
- {
4102
- BuiltinPtr builtin = BuiltinPtr::dynamicCast(type);
4103
- if((builtin && builtin->kind() == Builtin::KindObject))
4104
- {
4105
- string msg = "Struct data member `" + name + "' cannot be a value object.";
4106
- _unit->error(msg);
4107
- return 0;
4108
- }
4109
- ClassDeclPtr classDecl = ClassDeclPtr::dynamicCast(type);
4110
- if(classDecl != 0 && !classDecl->isLocal())
4111
- {
4112
- string msg = "Struct data member `" + name + "' cannot be a value object.";
4113
- _unit->error(msg);
4114
- return 0;
4115
- }
4116
- }
4117
- }
4118
-
4119
4429
  ContainedList matches = _unit->findContents(thisScope() + name);
4120
4430
  if(!matches.empty())
4121
4431
  {
@@ -4167,7 +4477,7 @@ Slice::Struct::createDataMember(const string& name, const TypePtr& type, bool op
4167
4477
  string dv = defaultValue;
4168
4478
  string dl = defaultLiteral;
4169
4479
 
4170
- if(dlt)
4480
+ if(dlt || (EnumPtr::dynamicCast(type) && !dv.empty()))
4171
4481
  {
4172
4482
  //
4173
4483
  // Validate the default value.
@@ -4200,6 +4510,8 @@ Slice::Struct::createDataMember(const string& name, const TypePtr& type, bool op
4200
4510
  }
4201
4511
  }
4202
4512
 
4513
+ checkDeprecatedType(_unit, type);
4514
+
4203
4515
  DataMemberPtr p = new DataMember(this, name, type, optional, tag, dlt, dv, dl);
4204
4516
  _contents.push_back(p);
4205
4517
  return p;
@@ -4230,7 +4542,9 @@ Slice::Struct::classDataMembers() const
4230
4542
  if(q)
4231
4543
  {
4232
4544
  BuiltinPtr builtin = BuiltinPtr::dynamicCast(q->type());
4233
- if((builtin && builtin->kind() == Builtin::KindObject) || ClassDeclPtr::dynamicCast(q->type()))
4545
+ if((builtin && builtin->kind() == Builtin::KindObject) ||
4546
+ (builtin && builtin->kind() == Builtin::KindValue) ||
4547
+ ClassDeclPtr::dynamicCast(q->type()))
4234
4548
  {
4235
4549
  result.push_back(q);
4236
4550
  }
@@ -4569,6 +4883,7 @@ Slice::Dictionary::legalKeyType(const TypePtr& type, bool& containsSequence)
4569
4883
  case Builtin::KindObject:
4570
4884
  case Builtin::KindObjectProxy:
4571
4885
  case Builtin::KindLocalObject:
4886
+ case Builtin::KindValue:
4572
4887
  {
4573
4888
  return false;
4574
4889
  break;
@@ -4630,71 +4945,9 @@ Slice::Dictionary::Dictionary(const ContainerPtr& container, const string& name,
4630
4945
  void
4631
4946
  Slice::Enum::destroy()
4632
4947
  {
4633
- _enumerators.clear();
4634
4948
  SyntaxTreeBase::destroy();
4635
4949
  }
4636
4950
 
4637
- EnumeratorList
4638
- Slice::Enum::getEnumerators()
4639
- {
4640
- return _enumerators;
4641
- }
4642
-
4643
- void
4644
- Slice::Enum::setEnumerators(const EnumeratorList& ens)
4645
- {
4646
- _enumerators = ens;
4647
- int lastValue = -1;
4648
- set<int> values;
4649
- for(EnumeratorList::iterator p = _enumerators.begin(); p != _enumerators.end(); ++p)
4650
- {
4651
- (*p)->_type = this;
4652
-
4653
- if((*p)->_explicitValue)
4654
- {
4655
- _explicitValue = true;
4656
-
4657
- if((*p)->_value < 0)
4658
- {
4659
- string msg = "value for enumerator `" + (*p)->name() + "' is out of range";
4660
- _unit->error(msg);
4661
- }
4662
- }
4663
- else
4664
- {
4665
- if(lastValue == Int32Max)
4666
- {
4667
- string msg = "value for enumerator `" + (*p)->name() + "' is out of range";
4668
- _unit->error(msg);
4669
- }
4670
-
4671
- //
4672
- // If the enumerator was not assigned an explicit value, we automatically assign
4673
- // it one more than the previous enumerator.
4674
- //
4675
- (*p)->_value = lastValue + 1;
4676
- }
4677
-
4678
- if(values.count((*p)->_value) != 0)
4679
- {
4680
- string msg = "enumerator `" + (*p)->name() + "' has a duplicate value";
4681
- _unit->error(msg);
4682
- }
4683
- values.insert((*p)->_value);
4684
-
4685
- lastValue = (*p)->_value;
4686
-
4687
- if(lastValue > _maxValue)
4688
- {
4689
- _maxValue = lastValue;
4690
- }
4691
- if(lastValue < _minValue)
4692
- {
4693
- _minValue = lastValue;
4694
- }
4695
- }
4696
- }
4697
-
4698
4951
  bool
4699
4952
  Slice::Enum::explicitValue() const
4700
4953
  {
@@ -4763,15 +5016,77 @@ Slice::Enum::recDependencies(set<ConstructedPtr>&)
4763
5016
 
4764
5017
  Slice::Enum::Enum(const ContainerPtr& container, const string& name, bool local) :
4765
5018
  SyntaxTreeBase(container->unit()),
5019
+ Container(container->unit()),
4766
5020
  Type(container->unit()),
4767
5021
  Contained(container, name),
4768
5022
  Constructed(container, name, local),
4769
5023
  _explicitValue(false),
4770
5024
  _minValue(Int32Max),
4771
- _maxValue(0)
5025
+ _maxValue(0),
5026
+ _lastValue(-1)
4772
5027
  {
4773
5028
  }
4774
5029
 
5030
+ int
5031
+ Slice::Enum::newEnumerator(const EnumeratorPtr& p)
5032
+ {
5033
+ if(p->explicitValue())
5034
+ {
5035
+ _explicitValue = true;
5036
+ _lastValue = p->value();
5037
+
5038
+ if(_lastValue < 0)
5039
+ {
5040
+ string msg = "value for enumerator `" + p->name() + "' is out of range";
5041
+ _unit->error(msg);
5042
+ }
5043
+ }
5044
+ else
5045
+ {
5046
+ if(_lastValue == Int32Max)
5047
+ {
5048
+ string msg = "value for enumerator `" + p->name() + "' is out of range";
5049
+ _unit->error(msg);
5050
+ }
5051
+ else
5052
+ {
5053
+ //
5054
+ // If the enumerator was not assigned an explicit value, we automatically assign
5055
+ // it one more than the previous enumerator.
5056
+ //
5057
+ ++_lastValue;
5058
+ }
5059
+ }
5060
+
5061
+ bool checkForDuplicates = true;
5062
+ if(_lastValue > _maxValue)
5063
+ {
5064
+ _maxValue = _lastValue;
5065
+ checkForDuplicates = false;
5066
+ }
5067
+ if(_lastValue < _minValue)
5068
+ {
5069
+ _minValue = _lastValue;
5070
+ checkForDuplicates = false;
5071
+ }
5072
+
5073
+ if(checkForDuplicates)
5074
+ {
5075
+ EnumeratorList enl = enumerators();
5076
+ for(EnumeratorList::iterator q = enl.begin(); q != enl.end(); ++q)
5077
+ {
5078
+ EnumeratorPtr& r = *q;
5079
+ if(r != p && r->value() == _lastValue)
5080
+ {
5081
+ _unit->error(string("enumerator `") + p->name() + "' has the same value as enumerator `" +
5082
+ r->name() + "'");
5083
+ }
5084
+ }
5085
+ }
5086
+
5087
+ return _lastValue;
5088
+ }
5089
+
4775
5090
  // ----------------------------------------------------------------------
4776
5091
  // Enumerator
4777
5092
  // ----------------------------------------------------------------------
@@ -4779,7 +5094,7 @@ Slice::Enum::Enum(const ContainerPtr& container, const string& name, bool local)
4779
5094
  EnumPtr
4780
5095
  Slice::Enumerator::type() const
4781
5096
  {
4782
- return _type;
5097
+ return EnumPtr::dynamicCast(container());
4783
5098
  }
4784
5099
 
4785
5100
  Contained::ContainedType
@@ -4818,6 +5133,7 @@ Slice::Enumerator::Enumerator(const ContainerPtr& container, const string& name)
4818
5133
  _explicitValue(false),
4819
5134
  _value(-1)
4820
5135
  {
5136
+ _value = EnumPtr::dynamicCast(container)->newEnumerator(this);
4821
5137
  }
4822
5138
 
4823
5139
  Slice::Enumerator::Enumerator(const ContainerPtr& container, const string& name, int value) :
@@ -4826,6 +5142,7 @@ Slice::Enumerator::Enumerator(const ContainerPtr& container, const string& name,
4826
5142
  _explicitValue(true),
4827
5143
  _value(value)
4828
5144
  {
5145
+ EnumPtr::dynamicCast(container)->newEnumerator(this);
4829
5146
  }
4830
5147
 
4831
5148
  // ----------------------------------------------------------------------
@@ -4898,6 +5215,11 @@ Slice::Const::Const(const ContainerPtr& container, const string& name, const Typ
4898
5215
  _value(value),
4899
5216
  _literal(literal)
4900
5217
  {
5218
+ if(valueType == 0)
5219
+ {
5220
+ cerr << "const " << name << " created with null valueType" << endl;
5221
+ }
5222
+
4901
5223
  }
4902
5224
 
4903
5225
  // ----------------------------------------------------------------------
@@ -4941,33 +5263,33 @@ Slice::Operation::sendMode() const
4941
5263
  }
4942
5264
  }
4943
5265
 
4944
- ParamDeclPtr
4945
- Slice::Operation::createParamDecl(const string& name, const TypePtr& type, bool isOutParam, bool optional, int tag)
5266
+ bool
5267
+ Slice::Operation::hasMarshaledResult() const
4946
5268
  {
4947
- checkIdentifier(name);
4948
-
4949
- if(_unit->profile() == IceE)
5269
+ ClassDefPtr cl = ClassDefPtr::dynamicCast(container());
5270
+ assert(cl);
5271
+ if(cl->hasMetaData("marshaled-result") || hasMetaData("marshaled-result"))
4950
5272
  {
4951
- ClassDefPtr cl = ClassDefPtr::dynamicCast(this->container());
4952
- assert(cl);
4953
- if(!cl->isLocal())
5273
+ if(returnType() && isMutableAfterReturnType(returnType()))
4954
5274
  {
4955
- BuiltinPtr builtin = BuiltinPtr::dynamicCast(type);
4956
- if((builtin && builtin->kind() == Builtin::KindObject))
4957
- {
4958
- string msg = "Object `" + name + "' cannot be passed by value.";
4959
- _unit->error(msg);
4960
- return 0;
4961
- }
4962
- ClassDeclPtr classDecl = ClassDeclPtr::dynamicCast(type);
4963
- if(classDecl != 0 && !classDecl->isLocal())
5275
+ return true;
5276
+ }
5277
+ for(ContainedList::const_iterator p = _contents.begin(); p != _contents.end(); ++p)
5278
+ {
5279
+ ParamDeclPtr q = ParamDeclPtr::dynamicCast(*p);
5280
+ if(q->isOutParam() && isMutableAfterReturnType(q->type()))
4964
5281
  {
4965
- string msg = "Object `" + name + "' cannot be passed by value.";
4966
- _unit->error(msg);
4967
- return 0;
5282
+ return true;
4968
5283
  }
4969
5284
  }
4970
5285
  }
5286
+ return false;
5287
+ }
5288
+
5289
+ ParamDeclPtr
5290
+ Slice::Operation::createParamDecl(const string& name, const TypePtr& type, bool isOutParam, bool optional, int tag)
5291
+ {
5292
+ checkIdentifier(name);
4971
5293
 
4972
5294
  ContainedList matches = _unit->findContents(thisScope() + name);
4973
5295
  if(!matches.empty())
@@ -5023,6 +5345,11 @@ Slice::Operation::createParamDecl(const string& name, const TypePtr& type, bool
5023
5345
  _unit->error(msg);
5024
5346
  }
5025
5347
 
5348
+ //
5349
+ // Issue a warning for a deprecated parameter type.
5350
+ //
5351
+ checkDeprecatedType(_unit, type);
5352
+
5026
5353
  if(optional)
5027
5354
  {
5028
5355
  //
@@ -5067,6 +5394,74 @@ Slice::Operation::parameters() const
5067
5394
  return result;
5068
5395
  }
5069
5396
 
5397
+ ParamDeclList
5398
+ Slice::Operation::inParameters() const
5399
+ {
5400
+ ParamDeclList result;
5401
+ for(ContainedList::const_iterator p = _contents.begin(); p != _contents.end(); ++p)
5402
+ {
5403
+ ParamDeclPtr q = ParamDeclPtr::dynamicCast(*p);
5404
+ if(q && !q->isOutParam())
5405
+ {
5406
+ result.push_back(q);
5407
+ }
5408
+ }
5409
+ return result;
5410
+ }
5411
+
5412
+ void
5413
+ Slice::Operation::inParameters(ParamDeclList& required, ParamDeclList& optional) const
5414
+ {
5415
+ const ParamDeclList params = inParameters();
5416
+ for(ParamDeclList::const_iterator pli = params.begin(); pli != params.end(); ++pli)
5417
+ {
5418
+ if((*pli)->optional())
5419
+ {
5420
+ optional.push_back(*pli);
5421
+ }
5422
+ else
5423
+ {
5424
+ required.push_back(*pli);
5425
+ }
5426
+ }
5427
+
5428
+ sortOptionalParameters(optional);
5429
+ }
5430
+
5431
+ ParamDeclList
5432
+ Slice::Operation::outParameters() const
5433
+ {
5434
+ ParamDeclList result;
5435
+ for(ContainedList::const_iterator p = _contents.begin(); p != _contents.end(); ++p)
5436
+ {
5437
+ ParamDeclPtr q = ParamDeclPtr::dynamicCast(*p);
5438
+ if(q && q->isOutParam())
5439
+ {
5440
+ result.push_back(q);
5441
+ }
5442
+ }
5443
+ return result;
5444
+ }
5445
+
5446
+ void
5447
+ Slice::Operation::outParameters(ParamDeclList& required, ParamDeclList& optional) const
5448
+ {
5449
+ const ParamDeclList params = outParameters();
5450
+ for(ParamDeclList::const_iterator pli = params.begin(); pli != params.end(); ++pli)
5451
+ {
5452
+ if((*pli)->optional())
5453
+ {
5454
+ optional.push_back(*pli);
5455
+ }
5456
+ else
5457
+ {
5458
+ required.push_back(*pli);
5459
+ }
5460
+ }
5461
+
5462
+ sortOptionalParameters(optional);
5463
+ }
5464
+
5070
5465
  ExceptionList
5071
5466
  Slice::Operation::throws() const
5072
5467
  {
@@ -5218,13 +5613,26 @@ Slice::Operation::returnsData() const
5218
5613
  return false;
5219
5614
  }
5220
5615
 
5616
+ bool
5617
+ Slice::Operation::returnsMultipleValues() const
5618
+ {
5619
+ size_t count = outParameters().size();
5620
+
5621
+ if(returnType())
5622
+ {
5623
+ ++count;
5624
+ }
5625
+
5626
+ return count > 1;
5627
+ }
5628
+
5221
5629
  bool
5222
5630
  Slice::Operation::sendsOptionals() const
5223
5631
  {
5224
- ParamDeclList pdl = parameters();
5632
+ ParamDeclList pdl = inParameters();
5225
5633
  for(ParamDeclList::const_iterator i = pdl.begin(); i != pdl.end(); ++i)
5226
5634
  {
5227
- if(!(*i)->isOutParam() && (*i)->optional())
5635
+ if((*i)->optional())
5228
5636
  {
5229
5637
  return true;
5230
5638
  }
@@ -5263,7 +5671,7 @@ Slice::Operation::attributes() const
5263
5671
  }
5264
5672
  if(i == 2)
5265
5673
  {
5266
- emitWarning(definitionContext()->filename(), line(), "invalid freeze metadata for operation");
5674
+ _unit->warning(InvalidMetaData, "invalid freeze metadata for operation");
5267
5675
  }
5268
5676
  else
5269
5677
  {
@@ -5284,7 +5692,7 @@ Slice::Operation::attributes() const
5284
5692
  {
5285
5693
  if(result != 0 && (i == int(Supports) || i == int(Never)))
5286
5694
  {
5287
- emitWarning(definitionContext()->filename(), line(), "invalid freeze metadata for operation");
5695
+ _unit->warning(InvalidMetaData, "invalid freeze metadata for operation");
5288
5696
  }
5289
5697
  else
5290
5698
  {
@@ -5298,7 +5706,7 @@ Slice::Operation::attributes() const
5298
5706
 
5299
5707
  if(i == 4)
5300
5708
  {
5301
- emitWarning(definitionContext()->filename(), line(), "invalid freeze metadata for operation");
5709
+ _unit->warning(InvalidMetaData, "invalid freeze metadata for operation");
5302
5710
 
5303
5711
  //
5304
5712
  // Set default
@@ -5356,25 +5764,9 @@ Slice::Operation::Operation(const ContainerPtr& container,
5356
5764
  _returnTag(returnTag),
5357
5765
  _mode(mode)
5358
5766
  {
5359
- if(_unit->profile() == IceE)
5767
+ if(returnType)
5360
5768
  {
5361
- ClassDefPtr cl = ClassDefPtr::dynamicCast(this->container());
5362
- assert(cl);
5363
- if(!cl->isLocal())
5364
- {
5365
- BuiltinPtr builtin = BuiltinPtr::dynamicCast(returnType);
5366
- if((builtin && builtin->kind() == Builtin::KindObject))
5367
- {
5368
- string msg = "Method `" + name + "' cannot return an object by value.";
5369
- _unit->error(msg);
5370
- }
5371
- ClassDeclPtr classDecl = ClassDeclPtr::dynamicCast(returnType);
5372
- if(classDecl != 0 && !classDecl->isLocal())
5373
- {
5374
- string msg = "Method `" + name + "' cannot return an object by value.";
5375
- _unit->error(msg);
5376
- }
5377
- }
5769
+ checkDeprecatedType(_unit, returnType);
5378
5770
  }
5379
5771
  }
5380
5772
 
@@ -5800,13 +6192,6 @@ Slice::Unit::setSeenDefinition()
5800
6192
  dc->setSeenDefinition();
5801
6193
  }
5802
6194
 
5803
- void
5804
- Slice::Unit::error(const char* s)
5805
- {
5806
- emitError(currentFile(), _currentLine, s);
5807
- _errors++;
5808
- }
5809
-
5810
6195
  void
5811
6196
  Slice::Unit::error(const string& s)
5812
6197
  {
@@ -5815,15 +6200,16 @@ Slice::Unit::error(const string& s)
5815
6200
  }
5816
6201
 
5817
6202
  void
5818
- Slice::Unit::warning(const char* s) const
5819
- {
5820
- emitWarning(currentFile(), _currentLine, s);
5821
- }
5822
-
5823
- void
5824
- Slice::Unit::warning(const string& s) const
6203
+ Slice::Unit::warning(WarningCategory category, const string& msg) const
5825
6204
  {
5826
- emitWarning(currentFile(), _currentLine, s);
6205
+ if(_definitionContextStack.empty())
6206
+ {
6207
+ emitWarning(currentFile(), _currentLine, msg);
6208
+ }
6209
+ else
6210
+ {
6211
+ _definitionContextStack.top()->warning(category, currentFile(), _currentLine, msg);
6212
+ }
5827
6213
  }
5828
6214
 
5829
6215
  ContainerPtr
@@ -6038,6 +6424,11 @@ Slice::Unit::usesNonLocals() const
6038
6424
  return true;
6039
6425
  }
6040
6426
 
6427
+ if(_builtins.find(Builtin::KindValue) != _builtins.end())
6428
+ {
6429
+ return true;
6430
+ }
6431
+
6041
6432
  return false;
6042
6433
  }
6043
6434
 
@@ -6059,12 +6450,6 @@ Slice::Unit::usesConsts() const
6059
6450
  return false;
6060
6451
  }
6061
6452
 
6062
- FeatureProfile
6063
- Slice::Unit::profile() const
6064
- {
6065
- return _featureProfile;
6066
- }
6067
-
6068
6453
  StringList
6069
6454
  Slice::Unit::includeFiles() const
6070
6455
  {
@@ -6084,7 +6469,7 @@ Slice::Unit::allFiles() const
6084
6469
  }
6085
6470
 
6086
6471
  int
6087
- Slice::Unit::parse(const string& filename, FILE* file, bool debug, Slice::FeatureProfile profile)
6472
+ Slice::Unit::parse(const string& filename, FILE* file, bool debug)
6088
6473
  {
6089
6474
  slice_debug = debug ? 1 : 0;
6090
6475
 
@@ -6094,7 +6479,6 @@ Slice::Unit::parse(const string& filename, FILE* file, bool debug, Slice::Featur
6094
6479
  _currentComment = "";
6095
6480
  _currentLine = 1;
6096
6481
  _currentIncludeLevel = 0;
6097
- _featureProfile = profile;
6098
6482
  _topLevelFile = fullPath(filename);
6099
6483
  pushContainer(this);
6100
6484
  pushDefinitionContext();
@@ -6130,6 +6514,11 @@ Slice::Unit::parse(const string& filename, FILE* file, bool debug, Slice::Featur
6130
6514
  popContainer();
6131
6515
  assert(_definitionContextStack.size() == 1);
6132
6516
  popDefinitionContext();
6517
+
6518
+ if(!checkUndefinedTypes())
6519
+ {
6520
+ status = EXIT_FAILURE;
6521
+ }
6133
6522
  }
6134
6523
 
6135
6524
  Slice::unit = 0;
@@ -6228,6 +6617,113 @@ Slice::Unit::eraseWhiteSpace(string& s)
6228
6617
  }
6229
6618
  }
6230
6619
 
6620
+ bool
6621
+ Slice::Unit::checkUndefinedTypes()
6622
+ {
6623
+ class Visitor : public ParserVisitor
6624
+ {
6625
+ public:
6626
+
6627
+ Visitor(int& errors) :
6628
+ _errors(errors),
6629
+ _local(false)
6630
+ {
6631
+ }
6632
+
6633
+ virtual bool visitClassDefStart(const ClassDefPtr& p)
6634
+ {
6635
+ _local = p->isLocal();
6636
+ return true;
6637
+ }
6638
+
6639
+ virtual bool visitExceptionStart(const ExceptionPtr& p)
6640
+ {
6641
+ _local = p->isLocal();
6642
+ return true;
6643
+ }
6644
+
6645
+ virtual bool visitStructStart(const StructPtr& p)
6646
+ {
6647
+ _local = p->isLocal();
6648
+ return true;
6649
+ }
6650
+
6651
+ virtual void visitOperation(const OperationPtr& p)
6652
+ {
6653
+ if(p->returnType())
6654
+ {
6655
+ checkUndefined(p->returnType(), "return type", p->file(), p->line());
6656
+ }
6657
+ ParamDeclList params = p->parameters();
6658
+ for(ParamDeclList::const_iterator q = params.begin(); q != params.end(); ++q)
6659
+ {
6660
+ checkUndefined((*q)->type(), "parameter " + (*q)->name(), (*q)->file(), (*q)->line());
6661
+ }
6662
+ }
6663
+
6664
+ virtual void visitParamDecl(const ParamDeclPtr& p)
6665
+ {
6666
+ checkUndefined(p->type(), "parameter " + p->name(), p->file(), p->line());
6667
+ }
6668
+
6669
+ virtual void visitDataMember(const DataMemberPtr& p)
6670
+ {
6671
+ checkUndefined(p->type(), "member " + p->name(), p->file(), p->line());
6672
+ }
6673
+
6674
+ virtual void visitSequence(const SequencePtr& p)
6675
+ {
6676
+ _local = p->isLocal();
6677
+ checkUndefined(p->type(), "element type", p->file(), p->line());
6678
+ }
6679
+
6680
+ virtual void visitDictionary(const DictionaryPtr& p)
6681
+ {
6682
+ _local = p->isLocal();
6683
+ checkUndefined(p->keyType(), "key type", p->file(), p->line());
6684
+ checkUndefined(p->valueType(), "value type", p->file(), p->line());
6685
+ }
6686
+
6687
+ private:
6688
+
6689
+ void checkUndefined(const TypePtr& type, const string& desc, const string& file, const string& line)
6690
+ {
6691
+ //
6692
+ // See ICE-6867. Any use of a proxy requires the full type definition, as does any
6693
+ // use of a class in a non-local context.
6694
+ //
6695
+ ProxyPtr p = ProxyPtr::dynamicCast(type);
6696
+ if(p)
6697
+ {
6698
+ const ClassDeclPtr cl = p->_class();
6699
+ if(!cl->definition())
6700
+ {
6701
+ ostringstream ostr;
6702
+ ostr << desc << " uses a proxy for undefined type `" << cl->scoped() << "'";
6703
+ emitError(file, line, ostr.str());
6704
+ _errors++;
6705
+ }
6706
+ }
6707
+
6708
+ ClassDeclPtr cl = ClassDeclPtr::dynamicCast(type);
6709
+ if(cl && !cl->definition() && !_local)
6710
+ {
6711
+ ostringstream ostr;
6712
+ ostr << desc << " refers to undefined type `" << cl->scoped() << "'";
6713
+ emitError(file, line, ostr.str());
6714
+ _errors++;
6715
+ }
6716
+ }
6717
+
6718
+ int& _errors;
6719
+ bool _local;
6720
+ };
6721
+
6722
+ Visitor v(_errors);
6723
+ visit(&v, true);
6724
+ return _errors == 0;
6725
+ }
6726
+
6231
6727
  // ----------------------------------------------------------------------
6232
6728
  // CICompare
6233
6729
  // ----------------------------------------------------------------------
@@ -6270,7 +6766,6 @@ Slice::cICompare(const std::string& s1, const std::string& s2)
6270
6766
  }
6271
6767
  #endif
6272
6768
 
6273
-
6274
6769
  // ----------------------------------------------------------------------
6275
6770
  // DerivedToBaseCompare
6276
6771
  // ----------------------------------------------------------------------