zeroc-ice 3.6.5 → 3.7.0

Sign up to get free protection for your applications and to get access to all the features.
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
  // ----------------------------------------------------------------------