zeroc-ice 3.6b1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/ICE_LICENSE +54 -0
- data/LICENSE +339 -0
- data/bin/slice2rb +17 -0
- data/ext/Communicator.cpp +596 -0
- data/ext/Communicator.h +25 -0
- data/ext/Config.h +111 -0
- data/ext/Connection.cpp +381 -0
- data/ext/Connection.h +26 -0
- data/ext/Endpoint.cpp +311 -0
- data/ext/Endpoint.h +27 -0
- data/ext/ImplicitContext.cpp +152 -0
- data/ext/ImplicitContext.h +25 -0
- data/ext/Init.cpp +52 -0
- data/ext/Logger.cpp +151 -0
- data/ext/Logger.h +28 -0
- data/ext/ObjectFactory.cpp +140 -0
- data/ext/ObjectFactory.h +50 -0
- data/ext/Operation.cpp +676 -0
- data/ext/Operation.h +36 -0
- data/ext/Properties.cpp +369 -0
- data/ext/Properties.h +25 -0
- data/ext/Proxy.cpp +1354 -0
- data/ext/Proxy.h +27 -0
- data/ext/Slice.cpp +223 -0
- data/ext/Slice.h +22 -0
- data/ext/Types.cpp +3160 -0
- data/ext/Types.h +545 -0
- data/ext/Util.cpp +792 -0
- data/ext/Util.h +511 -0
- data/ext/extconf.rb +118 -0
- data/ext/ice/BZIP_LICENSE +42 -0
- data/ext/ice/MCPP_LICENSE +36 -0
- data/ext/ice/bzip2/blocksort.c +1094 -0
- data/ext/ice/bzip2/bzlib.c +1572 -0
- data/ext/ice/bzip2/bzlib.h +282 -0
- data/ext/ice/bzip2/bzlib_private.h +509 -0
- data/ext/ice/bzip2/compress.c +672 -0
- data/ext/ice/bzip2/crctable.c +104 -0
- data/ext/ice/bzip2/decompress.c +646 -0
- data/ext/ice/bzip2/huffman.c +205 -0
- data/ext/ice/bzip2/randtable.c +84 -0
- data/ext/ice/cpp/include/Ice/ACMF.h +30 -0
- data/ext/ice/cpp/include/Ice/Application.h +156 -0
- data/ext/ice/cpp/include/Ice/AsyncResult.h +363 -0
- data/ext/ice/cpp/include/Ice/AsyncResultF.h +26 -0
- data/ext/ice/cpp/include/Ice/BasicStream.h +1315 -0
- data/ext/ice/cpp/include/Ice/Buffer.h +159 -0
- data/ext/ice/cpp/include/Ice/BuiltinSequences.h +74 -0
- data/ext/ice/cpp/include/Ice/Communicator.h +194 -0
- data/ext/ice/cpp/include/Ice/CommunicatorAsync.h +115 -0
- data/ext/ice/cpp/include/Ice/CommunicatorF.h +60 -0
- data/ext/ice/cpp/include/Ice/Config.h +97 -0
- data/ext/ice/cpp/include/Ice/Connection.h +495 -0
- data/ext/ice/cpp/include/Ice/ConnectionAsync.h +115 -0
- data/ext/ice/cpp/include/Ice/ConnectionF.h +72 -0
- data/ext/ice/cpp/include/Ice/ConnectionFactoryF.h +30 -0
- data/ext/ice/cpp/include/Ice/ConnectionIF.h +37 -0
- data/ext/ice/cpp/include/Ice/Current.h +94 -0
- data/ext/ice/cpp/include/Ice/DefaultObjectFactory.h +48 -0
- data/ext/ice/cpp/include/Ice/DeprecatedStringConverter.h +62 -0
- data/ext/ice/cpp/include/Ice/DispatchInterceptor.h +33 -0
- data/ext/ice/cpp/include/Ice/Dispatcher.h +51 -0
- data/ext/ice/cpp/include/Ice/DynamicLibrary.h +105 -0
- data/ext/ice/cpp/include/Ice/DynamicLibraryF.h +29 -0
- data/ext/ice/cpp/include/Ice/Endpoint.h +350 -0
- data/ext/ice/cpp/include/Ice/EndpointF.h +97 -0
- data/ext/ice/cpp/include/Ice/EndpointTypes.h +74 -0
- data/ext/ice/cpp/include/Ice/Exception.h +114 -0
- data/ext/ice/cpp/include/Ice/FacetMap.h +56 -0
- data/ext/ice/cpp/include/Ice/FactoryTable.h +69 -0
- data/ext/ice/cpp/include/Ice/FactoryTableInit.h +87 -0
- data/ext/ice/cpp/include/Ice/Format.h +39 -0
- data/ext/ice/cpp/include/Ice/Functional.h +138 -0
- data/ext/ice/cpp/include/Ice/GCObject.h +73 -0
- data/ext/ice/cpp/include/Ice/Handle.h +192 -0
- data/ext/ice/cpp/include/Ice/Ice.h +54 -0
- data/ext/ice/cpp/include/Ice/Identity.h +160 -0
- data/ext/ice/cpp/include/Ice/ImplicitContext.h +96 -0
- data/ext/ice/cpp/include/Ice/ImplicitContextF.h +60 -0
- data/ext/ice/cpp/include/Ice/Incoming.h +131 -0
- data/ext/ice/cpp/include/Ice/IncomingAsync.h +108 -0
- data/ext/ice/cpp/include/Ice/IncomingAsyncF.h +35 -0
- data/ext/ice/cpp/include/Ice/Initialize.h +141 -0
- data/ext/ice/cpp/include/Ice/InstanceF.h +26 -0
- data/ext/ice/cpp/include/Ice/Instrumentation.h +377 -0
- data/ext/ice/cpp/include/Ice/InstrumentationF.h +71 -0
- data/ext/ice/cpp/include/Ice/LocalException.h +1022 -0
- data/ext/ice/cpp/include/Ice/LocalObject.h +36 -0
- data/ext/ice/cpp/include/Ice/LocalObjectF.h +26 -0
- data/ext/ice/cpp/include/Ice/Locator.h +2191 -0
- data/ext/ice/cpp/include/Ice/LocatorF.h +89 -0
- data/ext/ice/cpp/include/Ice/Logger.h +94 -0
- data/ext/ice/cpp/include/Ice/LoggerF.h +60 -0
- data/ext/ice/cpp/include/Ice/LoggerUtil.h +153 -0
- data/ext/ice/cpp/include/Ice/Makefile +26 -0
- data/ext/ice/cpp/include/Ice/Metrics.h +2989 -0
- data/ext/ice/cpp/include/Ice/MetricsAdminI.h +662 -0
- data/ext/ice/cpp/include/Ice/MetricsFunctional.h +144 -0
- data/ext/ice/cpp/include/Ice/MetricsObserverI.h +576 -0
- data/ext/ice/cpp/include/Ice/NativePropertiesAdmin.h +55 -0
- data/ext/ice/cpp/include/Ice/Object.h +165 -0
- data/ext/ice/cpp/include/Ice/ObjectAdapter.h +162 -0
- data/ext/ice/cpp/include/Ice/ObjectAdapterF.h +60 -0
- data/ext/ice/cpp/include/Ice/ObjectAdapterFactoryF.h +26 -0
- data/ext/ice/cpp/include/Ice/ObjectF.h +26 -0
- data/ext/ice/cpp/include/Ice/ObjectFactory.h +86 -0
- data/ext/ice/cpp/include/Ice/ObjectFactoryF.h +60 -0
- data/ext/ice/cpp/include/Ice/ObjectFactoryManagerF.h +26 -0
- data/ext/ice/cpp/include/Ice/ObserverHelper.h +177 -0
- data/ext/ice/cpp/include/Ice/Outgoing.h +197 -0
- data/ext/ice/cpp/include/Ice/OutgoingAsync.h +264 -0
- data/ext/ice/cpp/include/Ice/OutgoingAsyncF.h +38 -0
- data/ext/ice/cpp/include/Ice/Plugin.h +121 -0
- data/ext/ice/cpp/include/Ice/PluginF.h +66 -0
- data/ext/ice/cpp/include/Ice/Process.h +568 -0
- data/ext/ice/cpp/include/Ice/ProcessF.h +77 -0
- data/ext/ice/cpp/include/Ice/Properties.h +130 -0
- data/ext/ice/cpp/include/Ice/PropertiesAdmin.h +824 -0
- data/ext/ice/cpp/include/Ice/PropertiesF.h +83 -0
- data/ext/ice/cpp/include/Ice/Protocol.h +242 -0
- data/ext/ice/cpp/include/Ice/Proxy.h +2448 -0
- data/ext/ice/cpp/include/Ice/ProxyF.h +78 -0
- data/ext/ice/cpp/include/Ice/ProxyFactoryF.h +26 -0
- data/ext/ice/cpp/include/Ice/ProxyHandle.h +330 -0
- data/ext/ice/cpp/include/Ice/ReferenceF.h +34 -0
- data/ext/ice/cpp/include/Ice/RemoteLogger.h +1496 -0
- data/ext/ice/cpp/include/Ice/RequestHandlerF.h +29 -0
- data/ext/ice/cpp/include/Ice/ResponseHandlerF.h +25 -0
- data/ext/ice/cpp/include/Ice/Router.h +1155 -0
- data/ext/ice/cpp/include/Ice/RouterF.h +77 -0
- data/ext/ice/cpp/include/Ice/ServantLocator.h +90 -0
- data/ext/ice/cpp/include/Ice/ServantLocatorF.h +60 -0
- data/ext/ice/cpp/include/Ice/ServantManagerF.h +26 -0
- data/ext/ice/cpp/include/Ice/Service.h +260 -0
- data/ext/ice/cpp/include/Ice/SliceChecksumDict.h +56 -0
- data/ext/ice/cpp/include/Ice/SliceChecksums.h +34 -0
- data/ext/ice/cpp/include/Ice/SlicedData.h +103 -0
- data/ext/ice/cpp/include/Ice/SlicedDataF.h +34 -0
- data/ext/ice/cpp/include/Ice/Stream.h +449 -0
- data/ext/ice/cpp/include/Ice/StreamF.h +30 -0
- data/ext/ice/cpp/include/Ice/StreamHelpers.h +877 -0
- data/ext/ice/cpp/include/Ice/ThreadPoolF.h +28 -0
- data/ext/ice/cpp/include/Ice/UserExceptionFactory.h +56 -0
- data/ext/ice/cpp/include/Ice/Version.h +254 -0
- data/ext/ice/cpp/include/IceSSL/Config.h +23 -0
- data/ext/ice/cpp/include/IceSSL/ConnectionInfo.h +119 -0
- data/ext/ice/cpp/include/IceSSL/EndpointInfo.h +101 -0
- data/ext/ice/cpp/include/IceSSL/IceSSL.h +22 -0
- data/ext/ice/cpp/include/IceSSL/Makefile +26 -0
- data/ext/ice/cpp/include/IceSSL/Plugin.h +558 -0
- data/ext/ice/cpp/include/IceUtil/AbstractMutex.h +119 -0
- data/ext/ice/cpp/include/IceUtil/Cache.h +362 -0
- data/ext/ice/cpp/include/IceUtil/Cond.h +323 -0
- data/ext/ice/cpp/include/IceUtil/Config.h +234 -0
- data/ext/ice/cpp/include/IceUtil/CountDownLatch.h +50 -0
- data/ext/ice/cpp/include/IceUtil/CtrlCHandler.h +70 -0
- data/ext/ice/cpp/include/IceUtil/DisableWarnings.h +45 -0
- data/ext/ice/cpp/include/IceUtil/Exception.h +184 -0
- data/ext/ice/cpp/include/IceUtil/Functional.h +389 -0
- data/ext/ice/cpp/include/IceUtil/Handle.h +266 -0
- data/ext/ice/cpp/include/IceUtil/IceUtil.h +51 -0
- data/ext/ice/cpp/include/IceUtil/IconvStringConverter.h +302 -0
- data/ext/ice/cpp/include/IceUtil/InputUtil.h +47 -0
- data/ext/ice/cpp/include/IceUtil/Iterator.h +36 -0
- data/ext/ice/cpp/include/IceUtil/Lock.h +135 -0
- data/ext/ice/cpp/include/IceUtil/Makefile +26 -0
- data/ext/ice/cpp/include/IceUtil/Monitor.h +249 -0
- data/ext/ice/cpp/include/IceUtil/Mutex.h +357 -0
- data/ext/ice/cpp/include/IceUtil/MutexProtocol.h +28 -0
- data/ext/ice/cpp/include/IceUtil/MutexPtrLock.h +83 -0
- data/ext/ice/cpp/include/IceUtil/MutexPtrTryLock.h +82 -0
- data/ext/ice/cpp/include/IceUtil/Optional.h +322 -0
- data/ext/ice/cpp/include/IceUtil/Options.h +141 -0
- data/ext/ice/cpp/include/IceUtil/OutputUtil.h +362 -0
- data/ext/ice/cpp/include/IceUtil/PopDisableWarnings.h +19 -0
- data/ext/ice/cpp/include/IceUtil/PushDisableWarnings.h +26 -0
- data/ext/ice/cpp/include/IceUtil/Random.h +24 -0
- data/ext/ice/cpp/include/IceUtil/RecMutex.h +113 -0
- data/ext/ice/cpp/include/IceUtil/SHA1.h +65 -0
- data/ext/ice/cpp/include/IceUtil/ScannerConfig.h +44 -0
- data/ext/ice/cpp/include/IceUtil/ScopedArray.h +97 -0
- data/ext/ice/cpp/include/IceUtil/Shared.h +168 -0
- data/ext/ice/cpp/include/IceUtil/StringConverter.h +175 -0
- data/ext/ice/cpp/include/IceUtil/StringUtil.h +91 -0
- data/ext/ice/cpp/include/IceUtil/Thread.h +181 -0
- data/ext/ice/cpp/include/IceUtil/ThreadException.h +108 -0
- data/ext/ice/cpp/include/IceUtil/Time.h +209 -0
- data/ext/ice/cpp/include/IceUtil/Timer.h +143 -0
- data/ext/ice/cpp/include/IceUtil/UUID.h +22 -0
- data/ext/ice/cpp/include/IceUtil/UndefSysMacros.h +42 -0
- data/ext/ice/cpp/include/IceUtil/UniquePtr.h +101 -0
- data/ext/ice/cpp/include/Slice/CPlusPlusUtil.h +64 -0
- data/ext/ice/cpp/include/Slice/Checksum.h +26 -0
- data/ext/ice/cpp/include/Slice/CsUtil.h +92 -0
- data/ext/ice/cpp/include/Slice/DotNetNames.h +34 -0
- data/ext/ice/cpp/include/Slice/FileTracker.h +71 -0
- data/ext/ice/cpp/include/Slice/JavaUtil.h +277 -0
- data/ext/ice/cpp/include/Slice/Makefile +26 -0
- data/ext/ice/cpp/include/Slice/PHPUtil.h +50 -0
- data/ext/ice/cpp/include/Slice/Parser.h +1116 -0
- data/ext/ice/cpp/include/Slice/Preprocessor.h +68 -0
- data/ext/ice/cpp/include/Slice/PythonUtil.h +64 -0
- data/ext/ice/cpp/include/Slice/RubyUtil.h +54 -0
- data/ext/ice/cpp/include/Slice/Util.h +33 -0
- data/ext/ice/cpp/src/Ice/ACM.cpp +343 -0
- data/ext/ice/cpp/src/Ice/ACM.h +117 -0
- data/ext/ice/cpp/src/Ice/Acceptor.cpp +16 -0
- data/ext/ice/cpp/src/Ice/Acceptor.h +41 -0
- data/ext/ice/cpp/src/Ice/AcceptorF.h +30 -0
- data/ext/ice/cpp/src/Ice/Application.cpp +760 -0
- data/ext/ice/cpp/src/Ice/AsyncResult.cpp +599 -0
- data/ext/ice/cpp/src/Ice/Base64.cpp +269 -0
- data/ext/ice/cpp/src/Ice/Base64.h +36 -0
- data/ext/ice/cpp/src/Ice/BasicStream.cpp +3393 -0
- data/ext/ice/cpp/src/Ice/Buffer.cpp +98 -0
- data/ext/ice/cpp/src/Ice/BuiltinSequences.cpp +34 -0
- data/ext/ice/cpp/src/Ice/CollocatedRequestHandler.cpp +718 -0
- data/ext/ice/cpp/src/Ice/CollocatedRequestHandler.h +106 -0
- data/ext/ice/cpp/src/Ice/Communicator.cpp +45 -0
- data/ext/ice/cpp/src/Ice/CommunicatorF.cpp +38 -0
- data/ext/ice/cpp/src/Ice/CommunicatorI.cpp +386 -0
- data/ext/ice/cpp/src/Ice/CommunicatorI.h +112 -0
- data/ext/ice/cpp/src/Ice/ConnectRequestHandler.cpp +546 -0
- data/ext/ice/cpp/src/Ice/ConnectRequestHandler.h +97 -0
- data/ext/ice/cpp/src/Ice/Connection.cpp +58 -0
- data/ext/ice/cpp/src/Ice/ConnectionF.cpp +38 -0
- data/ext/ice/cpp/src/Ice/ConnectionFactory.cpp +1639 -0
- data/ext/ice/cpp/src/Ice/ConnectionFactory.h +236 -0
- data/ext/ice/cpp/src/Ice/ConnectionI.cpp +3876 -0
- data/ext/ice/cpp/src/Ice/ConnectionI.h +364 -0
- data/ext/ice/cpp/src/Ice/ConnectionRequestHandler.cpp +115 -0
- data/ext/ice/cpp/src/Ice/ConnectionRequestHandler.h +50 -0
- data/ext/ice/cpp/src/Ice/Connector.cpp +16 -0
- data/ext/ice/cpp/src/Ice/Connector.h +36 -0
- data/ext/ice/cpp/src/Ice/ConnectorF.h +26 -0
- data/ext/ice/cpp/src/Ice/Current.cpp +38 -0
- data/ext/ice/cpp/src/Ice/DefaultsAndOverrides.cpp +168 -0
- data/ext/ice/cpp/src/Ice/DefaultsAndOverrides.h +57 -0
- data/ext/ice/cpp/src/Ice/DefaultsAndOverridesF.h +26 -0
- data/ext/ice/cpp/src/Ice/DeprecatedStringConverter.cpp +60 -0
- data/ext/ice/cpp/src/Ice/DispatchInterceptor.cpp +49 -0
- data/ext/ice/cpp/src/Ice/DynamicLibrary.cpp +281 -0
- data/ext/ice/cpp/src/Ice/Endpoint.cpp +53 -0
- data/ext/ice/cpp/src/Ice/EndpointF.cpp +38 -0
- data/ext/ice/cpp/src/Ice/EndpointFactory.cpp +25 -0
- data/ext/ice/cpp/src/Ice/EndpointFactory.h +44 -0
- data/ext/ice/cpp/src/Ice/EndpointFactoryF.h +26 -0
- data/ext/ice/cpp/src/Ice/EndpointFactoryManager.cpp +208 -0
- data/ext/ice/cpp/src/Ice/EndpointFactoryManager.h +46 -0
- data/ext/ice/cpp/src/Ice/EndpointFactoryManagerF.h +26 -0
- data/ext/ice/cpp/src/Ice/EndpointI.cpp +87 -0
- data/ext/ice/cpp/src/Ice/EndpointI.h +165 -0
- data/ext/ice/cpp/src/Ice/EndpointIF.h +41 -0
- data/ext/ice/cpp/src/Ice/EndpointTypes.cpp +38 -0
- data/ext/ice/cpp/src/Ice/EventHandler.cpp +35 -0
- data/ext/ice/cpp/src/Ice/EventHandler.h +78 -0
- data/ext/ice/cpp/src/Ice/EventHandlerF.h +26 -0
- data/ext/ice/cpp/src/Ice/EventLoggerMsg.h +53 -0
- data/ext/ice/cpp/src/Ice/Exception.cpp +832 -0
- data/ext/ice/cpp/src/Ice/FacetMap.cpp +34 -0
- data/ext/ice/cpp/src/Ice/FactoryTable.cpp +158 -0
- data/ext/ice/cpp/src/Ice/FactoryTableInit.cpp +95 -0
- data/ext/ice/cpp/src/Ice/GCObject.cpp +444 -0
- data/ext/ice/cpp/src/Ice/HashUtil.h +59 -0
- data/ext/ice/cpp/src/Ice/HttpParser.cpp +680 -0
- data/ext/ice/cpp/src/Ice/HttpParser.h +124 -0
- data/ext/ice/cpp/src/Ice/IPEndpointI.cpp +733 -0
- data/ext/ice/cpp/src/Ice/IPEndpointI.h +157 -0
- data/ext/ice/cpp/src/Ice/IPEndpointIF.h +29 -0
- data/ext/ice/cpp/src/Ice/Identity.cpp +42 -0
- data/ext/ice/cpp/src/Ice/ImplicitContext.cpp +41 -0
- data/ext/ice/cpp/src/Ice/ImplicitContextF.cpp +38 -0
- data/ext/ice/cpp/src/Ice/ImplicitContextI.cpp +639 -0
- data/ext/ice/cpp/src/Ice/ImplicitContextI.h +51 -0
- data/ext/ice/cpp/src/Ice/Incoming.cpp +757 -0
- data/ext/ice/cpp/src/Ice/IncomingAsync.cpp +340 -0
- data/ext/ice/cpp/src/Ice/IncomingRequest.h +37 -0
- data/ext/ice/cpp/src/Ice/Initialize.cpp +401 -0
- data/ext/ice/cpp/src/Ice/Instance.cpp +1928 -0
- data/ext/ice/cpp/src/Ice/Instance.h +198 -0
- data/ext/ice/cpp/src/Ice/Instrumentation.cpp +68 -0
- data/ext/ice/cpp/src/Ice/InstrumentationF.cpp +43 -0
- data/ext/ice/cpp/src/Ice/InstrumentationI.cpp +1083 -0
- data/ext/ice/cpp/src/Ice/InstrumentationI.h +262 -0
- data/ext/ice/cpp/src/Ice/LocalException.cpp +2091 -0
- data/ext/ice/cpp/src/Ice/LocalObject.cpp +29 -0
- data/ext/ice/cpp/src/Ice/Locator.cpp +1946 -0
- data/ext/ice/cpp/src/Ice/LocatorF.cpp +39 -0
- data/ext/ice/cpp/src/Ice/LocatorInfo.cpp +917 -0
- data/ext/ice/cpp/src/Ice/LocatorInfo.h +193 -0
- data/ext/ice/cpp/src/Ice/LocatorInfoF.h +34 -0
- data/ext/ice/cpp/src/Ice/Logger.cpp +40 -0
- data/ext/ice/cpp/src/Ice/LoggerAdminI.cpp +862 -0
- data/ext/ice/cpp/src/Ice/LoggerAdminI.h +46 -0
- data/ext/ice/cpp/src/Ice/LoggerF.cpp +38 -0
- data/ext/ice/cpp/src/Ice/LoggerI.cpp +199 -0
- data/ext/ice/cpp/src/Ice/LoggerI.h +57 -0
- data/ext/ice/cpp/src/Ice/LoggerUtil.cpp +107 -0
- data/ext/ice/cpp/src/Ice/Makefile +190 -0
- data/ext/ice/cpp/src/Ice/Metrics.cpp +2159 -0
- data/ext/ice/cpp/src/Ice/MetricsAdminI.cpp +669 -0
- data/ext/ice/cpp/src/Ice/MetricsObserverI.cpp +14 -0
- data/ext/ice/cpp/src/Ice/Network.cpp +2694 -0
- data/ext/ice/cpp/src/Ice/Network.h +291 -0
- data/ext/ice/cpp/src/Ice/NetworkF.h +28 -0
- data/ext/ice/cpp/src/Ice/NetworkProxy.cpp +325 -0
- data/ext/ice/cpp/src/Ice/NetworkProxy.h +74 -0
- data/ext/ice/cpp/src/Ice/NetworkProxyF.h +26 -0
- data/ext/ice/cpp/src/Ice/Object.cpp +440 -0
- data/ext/ice/cpp/src/Ice/ObjectAdapter.cpp +41 -0
- data/ext/ice/cpp/src/Ice/ObjectAdapterF.cpp +38 -0
- data/ext/ice/cpp/src/Ice/ObjectAdapterFactory.cpp +241 -0
- data/ext/ice/cpp/src/Ice/ObjectAdapterFactory.h +52 -0
- data/ext/ice/cpp/src/Ice/ObjectAdapterI.cpp +1498 -0
- data/ext/ice/cpp/src/Ice/ObjectAdapterI.h +155 -0
- data/ext/ice/cpp/src/Ice/ObjectFactory.cpp +41 -0
- data/ext/ice/cpp/src/Ice/ObjectFactoryF.cpp +38 -0
- data/ext/ice/cpp/src/Ice/ObjectFactoryManager.cpp +140 -0
- data/ext/ice/cpp/src/Ice/ObjectFactoryManager.h +43 -0
- data/ext/ice/cpp/src/Ice/ObserverHelper.cpp +84 -0
- data/ext/ice/cpp/src/Ice/OpaqueEndpointI.cpp +407 -0
- data/ext/ice/cpp/src/Ice/OpaqueEndpointI.h +70 -0
- data/ext/ice/cpp/src/Ice/Outgoing.cpp +737 -0
- data/ext/ice/cpp/src/Ice/OutgoingAsync.cpp +874 -0
- data/ext/ice/cpp/src/Ice/Plugin.cpp +43 -0
- data/ext/ice/cpp/src/Ice/PluginF.cpp +38 -0
- data/ext/ice/cpp/src/Ice/PluginManagerI.cpp +503 -0
- data/ext/ice/cpp/src/Ice/PluginManagerI.h +67 -0
- data/ext/ice/cpp/src/Ice/Process.cpp +299 -0
- data/ext/ice/cpp/src/Ice/ProcessF.cpp +39 -0
- data/ext/ice/cpp/src/Ice/Properties.cpp +45 -0
- data/ext/ice/cpp/src/Ice/PropertiesAdmin.cpp +555 -0
- data/ext/ice/cpp/src/Ice/PropertiesAdminI.cpp +207 -0
- data/ext/ice/cpp/src/Ice/PropertiesAdminI.h +45 -0
- data/ext/ice/cpp/src/Ice/PropertiesF.cpp +39 -0
- data/ext/ice/cpp/src/Ice/PropertiesI.cpp +759 -0
- data/ext/ice/cpp/src/Ice/PropertiesI.h +78 -0
- data/ext/ice/cpp/src/Ice/PropertyNames.cpp +1293 -0
- data/ext/ice/cpp/src/Ice/PropertyNames.h +81 -0
- data/ext/ice/cpp/src/Ice/Protocol.cpp +137 -0
- data/ext/ice/cpp/src/Ice/ProtocolInstance.cpp +98 -0
- data/ext/ice/cpp/src/Ice/ProtocolInstance.h +91 -0
- data/ext/ice/cpp/src/Ice/ProtocolInstanceF.h +26 -0
- data/ext/ice/cpp/src/Ice/ProtocolPluginFacade.cpp +51 -0
- data/ext/ice/cpp/src/Ice/ProtocolPluginFacade.h +67 -0
- data/ext/ice/cpp/src/Ice/ProtocolPluginFacadeF.h +26 -0
- data/ext/ice/cpp/src/Ice/Proxy.cpp +1810 -0
- data/ext/ice/cpp/src/Ice/ProxyFactory.cpp +305 -0
- data/ext/ice/cpp/src/Ice/ProxyFactory.h +57 -0
- data/ext/ice/cpp/src/Ice/Reference.cpp +1947 -0
- data/ext/ice/cpp/src/Ice/Reference.h +305 -0
- data/ext/ice/cpp/src/Ice/ReferenceFactory.cpp +937 -0
- data/ext/ice/cpp/src/Ice/ReferenceFactory.h +81 -0
- data/ext/ice/cpp/src/Ice/ReferenceFactoryF.h +24 -0
- data/ext/ice/cpp/src/Ice/RemoteLogger.cpp +958 -0
- data/ext/ice/cpp/src/Ice/ReplyStatus.h +29 -0
- data/ext/ice/cpp/src/Ice/RequestHandler.cpp +40 -0
- data/ext/ice/cpp/src/Ice/RequestHandler.h +90 -0
- data/ext/ice/cpp/src/Ice/RequestHandlerFactory.cpp +70 -0
- data/ext/ice/cpp/src/Ice/RequestHandlerFactory.h +41 -0
- data/ext/ice/cpp/src/Ice/ResponseHandler.cpp +20 -0
- data/ext/ice/cpp/src/Ice/ResponseHandler.h +39 -0
- data/ext/ice/cpp/src/Ice/RetryQueue.cpp +154 -0
- data/ext/ice/cpp/src/Ice/RetryQueue.h +69 -0
- data/ext/ice/cpp/src/Ice/RetryQueueF.h +24 -0
- data/ext/ice/cpp/src/Ice/Router.cpp +849 -0
- data/ext/ice/cpp/src/Ice/RouterF.cpp +39 -0
- data/ext/ice/cpp/src/Ice/RouterInfo.cpp +381 -0
- data/ext/ice/cpp/src/Ice/RouterInfo.h +148 -0
- data/ext/ice/cpp/src/Ice/RouterInfoF.h +30 -0
- data/ext/ice/cpp/src/Ice/Selector.cpp +926 -0
- data/ext/ice/cpp/src/Ice/Selector.h +231 -0
- data/ext/ice/cpp/src/Ice/ServantLocator.cpp +41 -0
- data/ext/ice/cpp/src/Ice/ServantLocatorF.cpp +38 -0
- data/ext/ice/cpp/src/Ice/ServantManager.cpp +495 -0
- data/ext/ice/cpp/src/Ice/ServantManager.h +74 -0
- data/ext/ice/cpp/src/Ice/Service.cpp +1897 -0
- data/ext/ice/cpp/src/Ice/SharedContext.h +51 -0
- data/ext/ice/cpp/src/Ice/SliceChecksumDict.cpp +34 -0
- data/ext/ice/cpp/src/Ice/SliceChecksums.cpp +80 -0
- data/ext/ice/cpp/src/Ice/SlicedData.cpp +80 -0
- data/ext/ice/cpp/src/Ice/Stream.cpp +53 -0
- data/ext/ice/cpp/src/Ice/StreamI.cpp +832 -0
- data/ext/ice/cpp/src/Ice/StreamI.h +198 -0
- data/ext/ice/cpp/src/Ice/StreamSocket.cpp +521 -0
- data/ext/ice/cpp/src/Ice/StreamSocket.h +85 -0
- data/ext/ice/cpp/src/Ice/StringConverterPlugin.cpp +145 -0
- data/ext/ice/cpp/src/Ice/SysLoggerI.cpp +167 -0
- data/ext/ice/cpp/src/Ice/SysLoggerI.h +43 -0
- data/ext/ice/cpp/src/Ice/TcpAcceptor.cpp +235 -0
- data/ext/ice/cpp/src/Ice/TcpAcceptor.h +67 -0
- data/ext/ice/cpp/src/Ice/TcpConnector.cpp +133 -0
- data/ext/ice/cpp/src/Ice/TcpConnector.h +51 -0
- data/ext/ice/cpp/src/Ice/TcpEndpointI.cpp +397 -0
- data/ext/ice/cpp/src/Ice/TcpEndpointI.h +93 -0
- data/ext/ice/cpp/src/Ice/TcpTransceiver.cpp +127 -0
- data/ext/ice/cpp/src/Ice/TcpTransceiver.h +61 -0
- data/ext/ice/cpp/src/Ice/ThreadPool.cpp +1357 -0
- data/ext/ice/cpp/src/Ice/ThreadPool.h +399 -0
- data/ext/ice/cpp/src/Ice/TraceLevels.cpp +43 -0
- data/ext/ice/cpp/src/Ice/TraceLevels.h +50 -0
- data/ext/ice/cpp/src/Ice/TraceLevelsF.h +26 -0
- data/ext/ice/cpp/src/Ice/TraceUtil.cpp +452 -0
- data/ext/ice/cpp/src/Ice/TraceUtil.h +28 -0
- data/ext/ice/cpp/src/Ice/Transceiver.cpp +24 -0
- data/ext/ice/cpp/src/Ice/Transceiver.h +52 -0
- data/ext/ice/cpp/src/Ice/TransceiverF.h +38 -0
- data/ext/ice/cpp/src/Ice/UdpConnector.cpp +144 -0
- data/ext/ice/cpp/src/Ice/UdpConnector.h +51 -0
- data/ext/ice/cpp/src/Ice/UdpEndpointI.cpp +483 -0
- data/ext/ice/cpp/src/Ice/UdpEndpointI.h +95 -0
- data/ext/ice/cpp/src/Ice/UdpTransceiver.cpp +1156 -0
- data/ext/ice/cpp/src/Ice/UdpTransceiver.h +123 -0
- data/ext/ice/cpp/src/Ice/Version.cpp +46 -0
- data/ext/ice/cpp/src/Ice/WSAcceptor.cpp +103 -0
- data/ext/ice/cpp/src/Ice/WSAcceptor.h +61 -0
- data/ext/ice/cpp/src/Ice/WSConnector.cpp +113 -0
- data/ext/ice/cpp/src/Ice/WSConnector.h +51 -0
- data/ext/ice/cpp/src/Ice/WSEndpoint.cpp +441 -0
- data/ext/ice/cpp/src/Ice/WSEndpoint.h +97 -0
- data/ext/ice/cpp/src/Ice/WSTransceiver.cpp +1728 -0
- data/ext/ice/cpp/src/Ice/WSTransceiver.h +149 -0
- data/ext/ice/cpp/src/IceDiscovery/IceDiscovery.cpp +594 -0
- data/ext/ice/cpp/src/IceDiscovery/IceDiscovery.h +1035 -0
- data/ext/ice/cpp/src/IceDiscovery/LocatorI.cpp +208 -0
- data/ext/ice/cpp/src/IceDiscovery/LocatorI.h +78 -0
- data/ext/ice/cpp/src/IceDiscovery/LookupI.cpp +308 -0
- data/ext/ice/cpp/src/IceDiscovery/LookupI.h +183 -0
- data/ext/ice/cpp/src/IceDiscovery/Makefile +61 -0
- data/ext/ice/cpp/src/IceDiscovery/PluginI.cpp +148 -0
- data/ext/ice/cpp/src/IceDiscovery/PluginI.h +39 -0
- data/ext/ice/cpp/src/IceSSL/AcceptorI.cpp +258 -0
- data/ext/ice/cpp/src/IceSSL/AcceptorI.h +66 -0
- data/ext/ice/cpp/src/IceSSL/Certificate.cpp +1334 -0
- data/ext/ice/cpp/src/IceSSL/ConnectionInfo.cpp +42 -0
- data/ext/ice/cpp/src/IceSSL/ConnectorI.cpp +151 -0
- data/ext/ice/cpp/src/IceSSL/ConnectorI.h +56 -0
- data/ext/ice/cpp/src/IceSSL/EndpointI.cpp +397 -0
- data/ext/ice/cpp/src/IceSSL/EndpointI.h +96 -0
- data/ext/ice/cpp/src/IceSSL/EndpointInfo.cpp +41 -0
- data/ext/ice/cpp/src/IceSSL/Instance.cpp +38 -0
- data/ext/ice/cpp/src/IceSSL/Instance.h +42 -0
- data/ext/ice/cpp/src/IceSSL/InstanceF.h +34 -0
- data/ext/ice/cpp/src/IceSSL/Makefile +82 -0
- data/ext/ice/cpp/src/IceSSL/OpenSSLEngine.cpp +1001 -0
- data/ext/ice/cpp/src/IceSSL/OpenSSLTransceiverI.cpp +607 -0
- data/ext/ice/cpp/src/IceSSL/OpenSSLTransceiverI.h +75 -0
- data/ext/ice/cpp/src/IceSSL/PluginI.cpp +102 -0
- data/ext/ice/cpp/src/IceSSL/PluginI.h +56 -0
- data/ext/ice/cpp/src/IceSSL/RFC2253.cpp +541 -0
- data/ext/ice/cpp/src/IceSSL/RFC2253.h +67 -0
- data/ext/ice/cpp/src/IceSSL/SChannelEngine.cpp +729 -0
- data/ext/ice/cpp/src/IceSSL/SChannelTransceiverI.cpp +1062 -0
- data/ext/ice/cpp/src/IceSSL/SChannelTransceiverI.h +130 -0
- data/ext/ice/cpp/src/IceSSL/SSLEngine.cpp +291 -0
- data/ext/ice/cpp/src/IceSSL/SSLEngine.h +264 -0
- data/ext/ice/cpp/src/IceSSL/SSLEngineF.h +41 -0
- data/ext/ice/cpp/src/IceSSL/SecureTransportEngine.cpp +1514 -0
- data/ext/ice/cpp/src/IceSSL/SecureTransportTransceiverI.cpp +609 -0
- data/ext/ice/cpp/src/IceSSL/SecureTransportTransceiverI.h +91 -0
- data/ext/ice/cpp/src/IceSSL/TrustManager.cpp +246 -0
- data/ext/ice/cpp/src/IceSSL/TrustManager.h +51 -0
- data/ext/ice/cpp/src/IceSSL/TrustManagerF.h +26 -0
- data/ext/ice/cpp/src/IceSSL/Util.cpp +1423 -0
- data/ext/ice/cpp/src/IceSSL/Util.h +136 -0
- data/ext/ice/cpp/src/IceUtil/ArgVector.cpp +65 -0
- data/ext/ice/cpp/src/IceUtil/ArgVector.h +41 -0
- data/ext/ice/cpp/src/IceUtil/Cond.cpp +386 -0
- data/ext/ice/cpp/src/IceUtil/ConvertUTF.cpp +477 -0
- data/ext/ice/cpp/src/IceUtil/ConvertUTF.h +144 -0
- data/ext/ice/cpp/src/IceUtil/CountDownLatch.cpp +184 -0
- data/ext/ice/cpp/src/IceUtil/CtrlCHandler.cpp +273 -0
- data/ext/ice/cpp/src/IceUtil/Exception.cpp +782 -0
- data/ext/ice/cpp/src/IceUtil/FileUtil.cpp +532 -0
- data/ext/ice/cpp/src/IceUtil/FileUtil.h +159 -0
- data/ext/ice/cpp/src/IceUtil/InputUtil.cpp +41 -0
- data/ext/ice/cpp/src/IceUtil/Makefile +68 -0
- data/ext/ice/cpp/src/IceUtil/MutexProtocol.cpp +24 -0
- data/ext/ice/cpp/src/IceUtil/Options.cpp +1049 -0
- data/ext/ice/cpp/src/IceUtil/OutputUtil.cpp +591 -0
- data/ext/ice/cpp/src/IceUtil/Random.cpp +185 -0
- data/ext/ice/cpp/src/IceUtil/RecMutex.cpp +257 -0
- data/ext/ice/cpp/src/IceUtil/SHA1.cpp +126 -0
- data/ext/ice/cpp/src/IceUtil/Shared.cpp +200 -0
- data/ext/ice/cpp/src/IceUtil/StopWatch.h +54 -0
- data/ext/ice/cpp/src/IceUtil/StringConverter.cpp +450 -0
- data/ext/ice/cpp/src/IceUtil/StringUtil.cpp +842 -0
- data/ext/ice/cpp/src/IceUtil/Thread.cpp +809 -0
- data/ext/ice/cpp/src/IceUtil/ThreadException.cpp +172 -0
- data/ext/ice/cpp/src/IceUtil/Time.cpp +306 -0
- data/ext/ice/cpp/src/IceUtil/Timer.cpp +251 -0
- data/ext/ice/cpp/src/IceUtil/UUID.cpp +174 -0
- data/ext/ice/cpp/src/IceUtil/Unicode.cpp +131 -0
- data/ext/ice/cpp/src/IceUtil/Unicode.h +49 -0
- data/ext/ice/cpp/src/Slice/CPlusPlusUtil.cpp +1139 -0
- data/ext/ice/cpp/src/Slice/Checksum.cpp +452 -0
- data/ext/ice/cpp/src/Slice/CsUtil.cpp +2650 -0
- data/ext/ice/cpp/src/Slice/DotNetNames.cpp +146 -0
- data/ext/ice/cpp/src/Slice/FileTracker.cpp +203 -0
- data/ext/ice/cpp/src/Slice/Grammar.cpp +4755 -0
- data/ext/ice/cpp/src/Slice/Grammar.h +98 -0
- data/ext/ice/cpp/src/Slice/GrammarUtil.h +234 -0
- data/ext/ice/cpp/src/Slice/JavaUtil.cpp +4376 -0
- data/ext/ice/cpp/src/Slice/MD5.cpp +57 -0
- data/ext/ice/cpp/src/Slice/MD5.h +44 -0
- data/ext/ice/cpp/src/Slice/MD5I.cpp +385 -0
- data/ext/ice/cpp/src/Slice/MD5I.h +91 -0
- data/ext/ice/cpp/src/Slice/Makefile +65 -0
- data/ext/ice/cpp/src/Slice/PHPUtil.cpp +156 -0
- data/ext/ice/cpp/src/Slice/Parser.cpp +6386 -0
- data/ext/ice/cpp/src/Slice/Preprocessor.cpp +686 -0
- data/ext/ice/cpp/src/Slice/Python.cpp +675 -0
- data/ext/ice/cpp/src/Slice/PythonUtil.cpp +2614 -0
- data/ext/ice/cpp/src/Slice/Ruby.cpp +317 -0
- data/ext/ice/cpp/src/Slice/RubyUtil.cpp +1774 -0
- data/ext/ice/cpp/src/Slice/Scanner.cpp +2426 -0
- data/ext/ice/cpp/src/Slice/Util.cpp +325 -0
- data/ext/ice/mcpp/config.h.Darwin +227 -0
- data/ext/ice/mcpp/config.h.Linux +227 -0
- data/ext/ice/mcpp/config.h.MINGW +7 -0
- data/ext/ice/mcpp/configed.H +382 -0
- data/ext/ice/mcpp/directive.c +1699 -0
- data/ext/ice/mcpp/eval.c +1673 -0
- data/ext/ice/mcpp/expand.c +2980 -0
- data/ext/ice/mcpp/internal.H +564 -0
- data/ext/ice/mcpp/main.c +1131 -0
- data/ext/ice/mcpp/mbchar.c +869 -0
- data/ext/ice/mcpp/mcpp_lib.h +31 -0
- data/ext/ice/mcpp/mcpp_out.h +13 -0
- data/ext/ice/mcpp/support.c +2811 -0
- data/ext/ice/mcpp/system.H +396 -0
- data/ext/ice/mcpp/system.c +4940 -0
- data/ice.gemspec +41 -0
- data/lib/Glacier2.rb +12 -0
- data/lib/Glacier2/Metrics.rb +99 -0
- data/lib/Glacier2/PermissionsVerifier.rb +168 -0
- data/lib/Glacier2/PermissionsVerifierF.rb +34 -0
- data/lib/Glacier2/Router.rb +141 -0
- data/lib/Glacier2/RouterF.rb +29 -0
- data/lib/Glacier2/SSLInfo.rb +79 -0
- data/lib/Glacier2/Session.rb +470 -0
- data/lib/Ice.rb +659 -0
- data/lib/Ice/BuiltinSequences.rb +64 -0
- data/lib/Ice/Communicator.rb +93 -0
- data/lib/Ice/CommunicatorF.rb +28 -0
- data/lib/Ice/Connection.rb +414 -0
- data/lib/Ice/ConnectionF.rb +36 -0
- data/lib/Ice/Current.rb +152 -0
- data/lib/Ice/Endpoint.rb +265 -0
- data/lib/Ice/EndpointF.rb +52 -0
- data/lib/Ice/EndpointTypes.rb +77 -0
- data/lib/Ice/FacetMap.rb +28 -0
- data/lib/Ice/Identity.rb +70 -0
- data/lib/Ice/ImplicitContext.rb +59 -0
- data/lib/Ice/ImplicitContextF.rb +28 -0
- data/lib/Ice/Instrumentation.rb +425 -0
- data/lib/Ice/InstrumentationF.rb +35 -0
- data/lib/Ice/LocalException.rb +1081 -0
- data/lib/Ice/Locator.rb +314 -0
- data/lib/Ice/LocatorF.rb +34 -0
- data/lib/Ice/Logger.rb +57 -0
- data/lib/Ice/LoggerF.rb +28 -0
- data/lib/Ice/Metrics.rb +696 -0
- data/lib/Ice/ObjectAdapterF.rb +28 -0
- data/lib/Ice/ObjectFactory.rb +53 -0
- data/lib/Ice/ObjectFactoryF.rb +28 -0
- data/lib/Ice/Plugin.rb +87 -0
- data/lib/Ice/PluginF.rb +32 -0
- data/lib/Ice/Process.rb +93 -0
- data/lib/Ice/ProcessF.rb +29 -0
- data/lib/Ice/Properties.rb +65 -0
- data/lib/Ice/PropertiesAdmin.rb +104 -0
- data/lib/Ice/PropertiesF.rb +33 -0
- data/lib/Ice/Router.rb +163 -0
- data/lib/Ice/RouterF.rb +29 -0
- data/lib/Ice/SliceChecksumDict.rb +28 -0
- data/lib/Ice/Version.rb +100 -0
- data/lib/IceBox.rb +10 -0
- data/lib/IceBox/IceBox.rb +272 -0
- data/lib/IceGrid.rb +17 -0
- data/lib/IceGrid/Admin.rb +1076 -0
- data/lib/IceGrid/Descriptor.rb +1505 -0
- data/lib/IceGrid/Exception.rb +401 -0
- data/lib/IceGrid/FileParser.rb +105 -0
- data/lib/IceGrid/Locator.rb +105 -0
- data/lib/IceGrid/Observer.rb +571 -0
- data/lib/IceGrid/Query.rb +168 -0
- data/lib/IceGrid/Registry.rb +120 -0
- data/lib/IceGrid/Session.rb +114 -0
- data/lib/IceGrid/UserAccountMapper.rb +101 -0
- data/lib/IcePatch2.rb +10 -0
- data/lib/IcePatch2/FileInfo.rb +75 -0
- data/lib/IcePatch2/FileServer.rb +141 -0
- data/lib/IceStorm.rb +11 -0
- data/lib/IceStorm/IceStorm.rb +463 -0
- data/lib/IceStorm/Metrics.rb +155 -0
- data/slice/Freeze/BackgroundSaveEvictor.ice +111 -0
- data/slice/Freeze/CatalogData.ice +49 -0
- data/slice/Freeze/Connection.ice +111 -0
- data/slice/Freeze/ConnectionF.ice +20 -0
- data/slice/Freeze/DB.ice +37 -0
- data/slice/Freeze/Evictor.ice +339 -0
- data/slice/Freeze/EvictorF.ice +22 -0
- data/slice/Freeze/EvictorStorage.ice +72 -0
- data/slice/Freeze/Exception.ice +100 -0
- data/slice/Freeze/Transaction.ice +57 -0
- data/slice/Freeze/TransactionalEvictor.ice +50 -0
- data/slice/Glacier2/Metrics.ice +77 -0
- data/slice/Glacier2/PermissionsVerifier.ice +105 -0
- data/slice/Glacier2/PermissionsVerifierF.ice +21 -0
- data/slice/Glacier2/Router.ice +178 -0
- data/slice/Glacier2/RouterF.ice +20 -0
- data/slice/Glacier2/SSLInfo.ice +50 -0
- data/slice/Glacier2/Session.ice +273 -0
- data/slice/Ice/BuiltinSequences.ice +48 -0
- data/slice/Ice/Communicator.ice +567 -0
- data/slice/Ice/CommunicatorF.ice +20 -0
- data/slice/Ice/Connection.ice +323 -0
- data/slice/Ice/ConnectionF.ice +22 -0
- data/slice/Ice/Current.ice +160 -0
- data/slice/Ice/Endpoint.ice +227 -0
- data/slice/Ice/EndpointF.ice +32 -0
- data/slice/Ice/EndpointTypes.ice +38 -0
- data/slice/Ice/FacetMap.ice +25 -0
- data/slice/Ice/Identity.ice +59 -0
- data/slice/Ice/ImplicitContext.ice +109 -0
- data/slice/Ice/ImplicitContextF.ice +20 -0
- data/slice/Ice/Instrumentation.ice +499 -0
- data/slice/Ice/InstrumentationF.ice +26 -0
- data/slice/Ice/LocalException.ice +1015 -0
- data/slice/Ice/Locator.ice +227 -0
- data/slice/Ice/LocatorF.ice +21 -0
- data/slice/Ice/Logger.ice +86 -0
- data/slice/Ice/LoggerF.ice +20 -0
- data/slice/Ice/Metrics.ice +422 -0
- data/slice/Ice/ObjectAdapter.ice +673 -0
- data/slice/Ice/ObjectAdapterF.ice +20 -0
- data/slice/Ice/ObjectFactory.ice +60 -0
- data/slice/Ice/ObjectFactoryF.ice +20 -0
- data/slice/Ice/Plugin.ice +117 -0
- data/slice/Ice/PluginF.ice +21 -0
- data/slice/Ice/Process.ice +54 -0
- data/slice/Ice/ProcessF.ice +20 -0
- data/slice/Ice/Properties.ice +228 -0
- data/slice/Ice/PropertiesAdmin.ice +75 -0
- data/slice/Ice/PropertiesF.ice +21 -0
- data/slice/Ice/RemoteLogger.ice +232 -0
- data/slice/Ice/Router.ice +83 -0
- data/slice/Ice/RouterF.ice +20 -0
- data/slice/Ice/ServantLocator.ice +117 -0
- data/slice/Ice/ServantLocatorF.ice +20 -0
- data/slice/Ice/SliceChecksumDict.ice +25 -0
- data/slice/Ice/Version.ice +39 -0
- data/slice/IceBox/IceBox.ice +194 -0
- data/slice/IceDiscovery/IceDiscovery.ice +32 -0
- data/slice/IceGrid/Admin.ice +1578 -0
- data/slice/IceGrid/Descriptor.ice +1079 -0
- data/slice/IceGrid/Discovery.ice +73 -0
- data/slice/IceGrid/Exception.ice +383 -0
- data/slice/IceGrid/FileParser.ice +61 -0
- data/slice/IceGrid/Locator.ice +56 -0
- data/slice/IceGrid/Observer.ice +394 -0
- data/slice/IceGrid/PluginFacade.ice +316 -0
- data/slice/IceGrid/Query.ice +130 -0
- data/slice/IceGrid/Registry.ice +138 -0
- data/slice/IceGrid/Session.ice +124 -0
- data/slice/IceGrid/UserAccountMapper.ice +58 -0
- data/slice/IcePatch2/FileInfo.ice +49 -0
- data/slice/IcePatch2/FileServer.ice +129 -0
- data/slice/IceSSL/ConnectionInfo.ice +34 -0
- data/slice/IceSSL/EndpointInfo.ice +41 -0
- data/slice/IceStorm/IceStorm.ice +405 -0
- data/slice/IceStorm/Metrics.ice +71 -0
- metadata +737 -0
data/ext/Proxy.h
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
// **********************************************************************
|
|
2
|
+
//
|
|
3
|
+
// Copyright (c) 2003-2014 ZeroC, Inc. All rights reserved.
|
|
4
|
+
//
|
|
5
|
+
// This copy of Ice is licensed to you under the terms described in the
|
|
6
|
+
// ICE_LICENSE file included in this distribution.
|
|
7
|
+
//
|
|
8
|
+
// **********************************************************************
|
|
9
|
+
|
|
10
|
+
#ifndef ICE_RUBY_PROXY_H
|
|
11
|
+
#define ICE_RUBY_PROXY_H
|
|
12
|
+
|
|
13
|
+
#include <Config.h>
|
|
14
|
+
#include <Ice/ProxyF.h>
|
|
15
|
+
#include <Ice/CommunicatorF.h>
|
|
16
|
+
|
|
17
|
+
namespace IceRuby
|
|
18
|
+
{
|
|
19
|
+
|
|
20
|
+
void initProxy(VALUE);
|
|
21
|
+
VALUE createProxy(const Ice::ObjectPrx&, VALUE = Qnil);
|
|
22
|
+
Ice::ObjectPrx getProxy(VALUE);
|
|
23
|
+
bool checkProxy(VALUE);
|
|
24
|
+
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
#endif
|
data/ext/Slice.cpp
ADDED
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
// **********************************************************************
|
|
2
|
+
//
|
|
3
|
+
// Copyright (c) 2003-2014 ZeroC, Inc. All rights reserved.
|
|
4
|
+
//
|
|
5
|
+
// This copy of Ice is licensed to you under the terms described in the
|
|
6
|
+
// ICE_LICENSE file included in this distribution.
|
|
7
|
+
//
|
|
8
|
+
// **********************************************************************
|
|
9
|
+
|
|
10
|
+
#include <Slice.h>
|
|
11
|
+
#include <Util.h>
|
|
12
|
+
#include <Slice/Preprocessor.h>
|
|
13
|
+
#include <Slice/RubyUtil.h>
|
|
14
|
+
#include <Slice/Util.h>
|
|
15
|
+
#include <IceUtil/Options.h>
|
|
16
|
+
|
|
17
|
+
using namespace std;
|
|
18
|
+
using namespace IceRuby;
|
|
19
|
+
using namespace Slice;
|
|
20
|
+
using namespace Slice::Ruby;
|
|
21
|
+
|
|
22
|
+
extern "C"
|
|
23
|
+
VALUE
|
|
24
|
+
IceRuby_loadSlice(int argc, VALUE* argv, VALUE self)
|
|
25
|
+
{
|
|
26
|
+
ICE_RUBY_TRY
|
|
27
|
+
{
|
|
28
|
+
if(argc < 1 || argc > 2)
|
|
29
|
+
{
|
|
30
|
+
throw RubyException(rb_eArgError, "wrong number of arguments");
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
string cmd = getString(argv[0]);
|
|
34
|
+
vector<string> argSeq;
|
|
35
|
+
try
|
|
36
|
+
{
|
|
37
|
+
argSeq = IceUtilInternal::Options::split(cmd);
|
|
38
|
+
}
|
|
39
|
+
catch(const IceUtilInternal::BadOptException& ex)
|
|
40
|
+
{
|
|
41
|
+
throw RubyException(rb_eArgError, "error in Slice options: %s", ex.reason.c_str());
|
|
42
|
+
}
|
|
43
|
+
catch(const IceUtilInternal::APIException& ex)
|
|
44
|
+
{
|
|
45
|
+
throw RubyException(rb_eArgError, "error in Slice options: %s", ex.reason.c_str());
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
if(argc > 1)
|
|
49
|
+
{
|
|
50
|
+
if(!arrayToStringSeq(argv[1], argSeq))
|
|
51
|
+
{
|
|
52
|
+
throw RubyException(rb_eTypeError, "argument 2 is not an array");
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
IceUtilInternal::Options opts;
|
|
57
|
+
opts.addOpt("D", "", IceUtilInternal::Options::NeedArg, "", IceUtilInternal::Options::Repeat);
|
|
58
|
+
opts.addOpt("U", "", IceUtilInternal::Options::NeedArg, "", IceUtilInternal::Options::Repeat);
|
|
59
|
+
opts.addOpt("I", "", IceUtilInternal::Options::NeedArg, "", IceUtilInternal::Options::Repeat);
|
|
60
|
+
opts.addOpt("d", "debug");
|
|
61
|
+
opts.addOpt("", "ice");
|
|
62
|
+
opts.addOpt("", "underscore");
|
|
63
|
+
opts.addOpt("", "checksum");
|
|
64
|
+
opts.addOpt("", "all");
|
|
65
|
+
|
|
66
|
+
vector<string> files;
|
|
67
|
+
try
|
|
68
|
+
{
|
|
69
|
+
argSeq.insert(argSeq.begin(), ""); // dummy argv[0]
|
|
70
|
+
files = opts.parse(argSeq);
|
|
71
|
+
if(files.empty())
|
|
72
|
+
{
|
|
73
|
+
throw RubyException(rb_eArgError, "no Slice files specified in `%s'", cmd.c_str());
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
catch(const IceUtilInternal::BadOptException& ex)
|
|
77
|
+
{
|
|
78
|
+
throw RubyException(rb_eArgError, "error in Slice options: %s", ex.reason.c_str());
|
|
79
|
+
}
|
|
80
|
+
catch(const IceUtilInternal::APIException& ex)
|
|
81
|
+
{
|
|
82
|
+
throw RubyException(rb_eArgError, "error in Slice options: %s", ex.reason.c_str());
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
vector<string> cppArgs;
|
|
86
|
+
vector<string> includePaths;
|
|
87
|
+
bool debug = false;
|
|
88
|
+
bool ice = true; // This must be true so that we can create Ice::Identity when necessary.
|
|
89
|
+
bool underscore = opts.isSet("underscore");
|
|
90
|
+
bool all = false;
|
|
91
|
+
bool checksum = false;
|
|
92
|
+
if(opts.isSet("D"))
|
|
93
|
+
{
|
|
94
|
+
vector<string> optargs = opts.argVec("D");
|
|
95
|
+
for(vector<string>::const_iterator i = optargs.begin(); i != optargs.end(); ++i)
|
|
96
|
+
{
|
|
97
|
+
cppArgs.push_back("-D" + *i);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
if(opts.isSet("U"))
|
|
101
|
+
{
|
|
102
|
+
vector<string> optargs = opts.argVec("U");
|
|
103
|
+
for(vector<string>::const_iterator i = optargs.begin(); i != optargs.end(); ++i)
|
|
104
|
+
{
|
|
105
|
+
cppArgs.push_back("-U" + *i);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
if(opts.isSet("I"))
|
|
109
|
+
{
|
|
110
|
+
includePaths = opts.argVec("I");
|
|
111
|
+
for(vector<string>::const_iterator i = includePaths.begin(); i != includePaths.end(); ++i)
|
|
112
|
+
{
|
|
113
|
+
cppArgs.push_back("-I" + *i);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
debug = opts.isSet("d") || opts.isSet("debug");
|
|
117
|
+
all = opts.isSet("all");
|
|
118
|
+
checksum = opts.isSet("checksum");
|
|
119
|
+
|
|
120
|
+
bool ignoreRedefs = false;
|
|
121
|
+
|
|
122
|
+
for(vector<string>::const_iterator p = files.begin(); p != files.end(); ++p)
|
|
123
|
+
{
|
|
124
|
+
string file = *p;
|
|
125
|
+
Slice::PreprocessorPtr icecpp = Slice::Preprocessor::create("icecpp", file, cppArgs);
|
|
126
|
+
FILE* cppHandle = icecpp->preprocess(false, "-D__SLICE2RB__");
|
|
127
|
+
|
|
128
|
+
if(cppHandle == 0)
|
|
129
|
+
{
|
|
130
|
+
throw RubyException(rb_eArgError, "Slice preprocessing failed for `%s'", cmd.c_str());
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
UnitPtr u = Slice::Unit::createUnit(ignoreRedefs, all, ice, underscore);
|
|
134
|
+
int parseStatus = u->parse(file, cppHandle, debug);
|
|
135
|
+
|
|
136
|
+
if(!icecpp->close() || parseStatus == EXIT_FAILURE)
|
|
137
|
+
{
|
|
138
|
+
u->destroy();
|
|
139
|
+
throw RubyException(rb_eArgError, "Slice parsing failed for `%s'", cmd.c_str());
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
//
|
|
143
|
+
// Generate the Ruby code into a string stream.
|
|
144
|
+
//
|
|
145
|
+
ostringstream codeStream;
|
|
146
|
+
IceUtilInternal::Output out(codeStream);
|
|
147
|
+
out.setUseTab(false);
|
|
148
|
+
generate(u, all, checksum, includePaths, out);
|
|
149
|
+
u->destroy();
|
|
150
|
+
|
|
151
|
+
string code = codeStream.str();
|
|
152
|
+
callRuby(rb_eval_string, code.c_str());
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
ICE_RUBY_CATCH
|
|
156
|
+
|
|
157
|
+
return Qnil;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
extern "C"
|
|
161
|
+
VALUE
|
|
162
|
+
IceRuby_compile(int argc, VALUE* argv, VALUE self)
|
|
163
|
+
{
|
|
164
|
+
ICE_RUBY_TRY
|
|
165
|
+
{
|
|
166
|
+
if(argc != 1)
|
|
167
|
+
{
|
|
168
|
+
throw RubyException(rb_eArgError, "wrong number of arguments");
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
vector<string> argSeq;
|
|
172
|
+
if(!arrayToStringSeq(argv[0], argSeq))
|
|
173
|
+
{
|
|
174
|
+
throw RubyException(rb_eTypeError, "argument is not an array");
|
|
175
|
+
}
|
|
176
|
+
char** argv = new char*[argSeq.size()+1];
|
|
177
|
+
// Manufacture a fake argv[0].
|
|
178
|
+
argv[0] = const_cast<char*>("slice2rb");
|
|
179
|
+
for(size_t i = 0; i < argSeq.size(); ++i)
|
|
180
|
+
{
|
|
181
|
+
argv[i+1] = const_cast<char*>(argSeq[i].c_str());
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
int rc;
|
|
185
|
+
try
|
|
186
|
+
{
|
|
187
|
+
rc = Slice::Ruby::compile(argSeq.size()+1, argv);
|
|
188
|
+
}
|
|
189
|
+
catch(const std::exception& ex)
|
|
190
|
+
{
|
|
191
|
+
getErrorStream() << argv[0] << ": error:" << ex.what() << endl;
|
|
192
|
+
rc = EXIT_FAILURE;
|
|
193
|
+
}
|
|
194
|
+
catch(const std::string& msg)
|
|
195
|
+
{
|
|
196
|
+
getErrorStream() << argv[0] << ": error:" << msg << endl;
|
|
197
|
+
rc = EXIT_FAILURE;
|
|
198
|
+
}
|
|
199
|
+
catch(const char* msg)
|
|
200
|
+
{
|
|
201
|
+
getErrorStream() << argv[0] << ": error:" << msg << endl;
|
|
202
|
+
rc = EXIT_FAILURE;
|
|
203
|
+
}
|
|
204
|
+
catch(...)
|
|
205
|
+
{
|
|
206
|
+
getErrorStream() << argv[0] << ": error:" << "unknown exception" << endl;
|
|
207
|
+
rc = EXIT_FAILURE;
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
delete[] argv;
|
|
211
|
+
return INT2FIX(rc);
|
|
212
|
+
}
|
|
213
|
+
ICE_RUBY_CATCH
|
|
214
|
+
|
|
215
|
+
return Qnil;
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
void
|
|
219
|
+
IceRuby::initSlice(VALUE iceModule)
|
|
220
|
+
{
|
|
221
|
+
rb_define_module_function(iceModule, "loadSlice", CAST_METHOD(IceRuby_loadSlice), -1);
|
|
222
|
+
rb_define_module_function(iceModule, "compile", CAST_METHOD(IceRuby_compile), -1);
|
|
223
|
+
}
|
data/ext/Slice.h
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
// **********************************************************************
|
|
2
|
+
//
|
|
3
|
+
// Copyright (c) 2003-2014 ZeroC, Inc. All rights reserved.
|
|
4
|
+
//
|
|
5
|
+
// This copy of Ice is licensed to you under the terms described in the
|
|
6
|
+
// ICE_LICENSE file included in this distribution.
|
|
7
|
+
//
|
|
8
|
+
// **********************************************************************
|
|
9
|
+
|
|
10
|
+
#ifndef ICE_RUBY_SLICE_H
|
|
11
|
+
#define ICE_RUBY_SLICE_H
|
|
12
|
+
|
|
13
|
+
#include <Config.h>
|
|
14
|
+
|
|
15
|
+
namespace IceRuby
|
|
16
|
+
{
|
|
17
|
+
|
|
18
|
+
void initSlice(VALUE);
|
|
19
|
+
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
#endif
|
data/ext/Types.cpp
ADDED
|
@@ -0,0 +1,3160 @@
|
|
|
1
|
+
// **********************************************************************
|
|
2
|
+
//
|
|
3
|
+
// Copyright (c) 2003-2014 ZeroC, Inc. All rights reserved.
|
|
4
|
+
//
|
|
5
|
+
// This copy of Ice is licensed to you under the terms described in the
|
|
6
|
+
// ICE_LICENSE file included in this distribution.
|
|
7
|
+
//
|
|
8
|
+
// **********************************************************************
|
|
9
|
+
|
|
10
|
+
#include <Types.h>
|
|
11
|
+
#include <Proxy.h>
|
|
12
|
+
#include <Util.h>
|
|
13
|
+
#include <IceUtil/InputUtil.h>
|
|
14
|
+
#include <IceUtil/OutputUtil.h>
|
|
15
|
+
#include <IceUtil/ScopedArray.h>
|
|
16
|
+
#include <Ice/LocalException.h>
|
|
17
|
+
#include <Ice/SlicedData.h>
|
|
18
|
+
#include <list>
|
|
19
|
+
|
|
20
|
+
//
|
|
21
|
+
// Required for RHASH_SIZE to work properly with Ruby 1.8.x.
|
|
22
|
+
// T_ZOMBIE is only defined in Ruby 1.9.
|
|
23
|
+
//
|
|
24
|
+
#ifndef T_ZOMBIE
|
|
25
|
+
# include "st.h"
|
|
26
|
+
#endif
|
|
27
|
+
|
|
28
|
+
#ifndef RHASH_SIZE
|
|
29
|
+
# define RHASH_SIZE(v) RHASH(v)->tbl->num_entries
|
|
30
|
+
#endif
|
|
31
|
+
|
|
32
|
+
using namespace std;
|
|
33
|
+
using namespace IceRuby;
|
|
34
|
+
using namespace IceUtil;
|
|
35
|
+
using namespace IceUtilInternal;
|
|
36
|
+
|
|
37
|
+
static VALUE _typeInfoClass, _exceptionInfoClass, _unsetTypeClass;
|
|
38
|
+
|
|
39
|
+
typedef map<string, ClassInfoPtr> ClassInfoMap;
|
|
40
|
+
static ClassInfoMap _classInfoMap;
|
|
41
|
+
|
|
42
|
+
typedef map<Ice::Int, ClassInfoPtr> CompactIdMap;
|
|
43
|
+
static CompactIdMap _compactIdMap;
|
|
44
|
+
|
|
45
|
+
typedef map<string, ProxyInfoPtr> ProxyInfoMap;
|
|
46
|
+
static ProxyInfoMap _proxyInfoMap;
|
|
47
|
+
|
|
48
|
+
typedef map<string, ExceptionInfoPtr> ExceptionInfoMap;
|
|
49
|
+
static ExceptionInfoMap _exceptionInfoMap;
|
|
50
|
+
|
|
51
|
+
namespace IceRuby
|
|
52
|
+
{
|
|
53
|
+
|
|
54
|
+
VALUE Unset;
|
|
55
|
+
|
|
56
|
+
class InfoMapDestroyer
|
|
57
|
+
{
|
|
58
|
+
public:
|
|
59
|
+
|
|
60
|
+
~InfoMapDestroyer();
|
|
61
|
+
};
|
|
62
|
+
static InfoMapDestroyer infoMapDestroyer;
|
|
63
|
+
|
|
64
|
+
class ReadObjectCallback : public Ice::ReadObjectCallback
|
|
65
|
+
{
|
|
66
|
+
public:
|
|
67
|
+
|
|
68
|
+
ReadObjectCallback(const ClassInfoPtr&, const UnmarshalCallbackPtr&, VALUE, void*);
|
|
69
|
+
|
|
70
|
+
virtual void invoke(const Ice::ObjectPtr&);
|
|
71
|
+
|
|
72
|
+
private:
|
|
73
|
+
|
|
74
|
+
ClassInfoPtr _info;
|
|
75
|
+
UnmarshalCallbackPtr _cb;
|
|
76
|
+
VALUE _target;
|
|
77
|
+
void* _closure;
|
|
78
|
+
};
|
|
79
|
+
|
|
80
|
+
string
|
|
81
|
+
escapeString(const string& str)
|
|
82
|
+
{
|
|
83
|
+
static const string basicSourceChars = "abcdefghijklmnopqrstuvwxyz"
|
|
84
|
+
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
|
|
85
|
+
"0123456789"
|
|
86
|
+
"_{}[]#()<>%:;.?*+-/^&|~!=,\\\"' ";
|
|
87
|
+
static const set<char> charSet(basicSourceChars.begin(), basicSourceChars.end());
|
|
88
|
+
|
|
89
|
+
ostringstream out;
|
|
90
|
+
|
|
91
|
+
for(string::const_iterator c = str.begin(); c != str.end(); ++c)
|
|
92
|
+
{
|
|
93
|
+
if(charSet.find(*c) == charSet.end())
|
|
94
|
+
{
|
|
95
|
+
unsigned char uc = *c; // char may be signed, so make it positive
|
|
96
|
+
ostringstream s;
|
|
97
|
+
s << "\\"; // Print as octal if not in basic source character set
|
|
98
|
+
s.width(3);
|
|
99
|
+
s.fill('0');
|
|
100
|
+
s << oct;
|
|
101
|
+
s << static_cast<unsigned>(uc);
|
|
102
|
+
out << s.str();
|
|
103
|
+
}
|
|
104
|
+
else
|
|
105
|
+
{
|
|
106
|
+
out << *c; // Print normally if in basic source character set
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
return out.str();
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
//
|
|
116
|
+
// addClassInfo()
|
|
117
|
+
//
|
|
118
|
+
static void
|
|
119
|
+
addClassInfo(const string& id, const ClassInfoPtr& info)
|
|
120
|
+
{
|
|
121
|
+
//
|
|
122
|
+
// Do not assert. An application may load statically-
|
|
123
|
+
// translated definitions and then dynamically load
|
|
124
|
+
// duplicate definitions.
|
|
125
|
+
//
|
|
126
|
+
// assert(_classInfoMap.find(id) == _classInfoMap.end());
|
|
127
|
+
ClassInfoMap::iterator p = _classInfoMap.find(id);
|
|
128
|
+
if(p != _classInfoMap.end())
|
|
129
|
+
{
|
|
130
|
+
_classInfoMap.erase(p);
|
|
131
|
+
}
|
|
132
|
+
_classInfoMap.insert(ClassInfoMap::value_type(id, info));
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
//
|
|
136
|
+
// addProxyInfo()
|
|
137
|
+
//
|
|
138
|
+
static void
|
|
139
|
+
addProxyInfo(const string& id, const ProxyInfoPtr& info)
|
|
140
|
+
{
|
|
141
|
+
//
|
|
142
|
+
// Do not assert. An application may load statically-
|
|
143
|
+
// translated definitions and then dynamically load
|
|
144
|
+
// duplicate definitions.
|
|
145
|
+
//
|
|
146
|
+
// assert(_proxyInfoMap.find(id) == _proxyInfoMap.end());
|
|
147
|
+
ProxyInfoMap::iterator p = _proxyInfoMap.find(id);
|
|
148
|
+
if(p != _proxyInfoMap.end())
|
|
149
|
+
{
|
|
150
|
+
_proxyInfoMap.erase(p);
|
|
151
|
+
}
|
|
152
|
+
_proxyInfoMap.insert(ProxyInfoMap::value_type(id, info));
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
//
|
|
156
|
+
// lookupProxyInfo()
|
|
157
|
+
//
|
|
158
|
+
static IceRuby::ProxyInfoPtr
|
|
159
|
+
lookupProxyInfo(const string& id)
|
|
160
|
+
{
|
|
161
|
+
ProxyInfoMap::iterator p = _proxyInfoMap.find(id);
|
|
162
|
+
if(p != _proxyInfoMap.end())
|
|
163
|
+
{
|
|
164
|
+
return p->second;
|
|
165
|
+
}
|
|
166
|
+
return 0;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
//
|
|
170
|
+
// addExceptionInfo()
|
|
171
|
+
//
|
|
172
|
+
static void
|
|
173
|
+
addExceptionInfo(const string& id, const ExceptionInfoPtr& info)
|
|
174
|
+
{
|
|
175
|
+
//
|
|
176
|
+
// Do not assert. An application may load statically-
|
|
177
|
+
// translated definitions and then dynamically load
|
|
178
|
+
// duplicate definitions.
|
|
179
|
+
//
|
|
180
|
+
// assert(_exceptionInfoMap.find(id) == _exceptionInfoMap.end());
|
|
181
|
+
_exceptionInfoMap.insert(ExceptionInfoMap::value_type(id, info));
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
//
|
|
185
|
+
// SlicedDataUtil implementation
|
|
186
|
+
//
|
|
187
|
+
VALUE IceRuby::SlicedDataUtil::_slicedDataType = Qnil;
|
|
188
|
+
VALUE IceRuby::SlicedDataUtil::_sliceInfoType = Qnil;
|
|
189
|
+
|
|
190
|
+
IceRuby::SlicedDataUtil::SlicedDataUtil()
|
|
191
|
+
{
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
IceRuby::SlicedDataUtil::~SlicedDataUtil()
|
|
195
|
+
{
|
|
196
|
+
//
|
|
197
|
+
// Make sure we break any cycles among the ObjectReaders in preserved slices.
|
|
198
|
+
//
|
|
199
|
+
for(set<ObjectReaderPtr>::iterator p = _readers.begin(); p != _readers.end(); ++p)
|
|
200
|
+
{
|
|
201
|
+
Ice::SlicedDataPtr slicedData = (*p)->getSlicedData();
|
|
202
|
+
for(Ice::SliceInfoSeq::const_iterator q = slicedData->slices.begin(); q != slicedData->slices.end(); ++q)
|
|
203
|
+
{
|
|
204
|
+
//
|
|
205
|
+
// Don't just call (*q)->objects.clear(), as releasing references
|
|
206
|
+
// to the objects could have unexpected side effects. We exchange
|
|
207
|
+
// the vector into a temporary and then let the temporary fall out
|
|
208
|
+
// of scope.
|
|
209
|
+
//
|
|
210
|
+
vector<Ice::ObjectPtr> tmp;
|
|
211
|
+
tmp.swap((*q)->objects);
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
void
|
|
217
|
+
IceRuby::SlicedDataUtil::add(const ObjectReaderPtr& reader)
|
|
218
|
+
{
|
|
219
|
+
assert(reader->getSlicedData());
|
|
220
|
+
_readers.insert(reader);
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
void
|
|
224
|
+
IceRuby::SlicedDataUtil::update()
|
|
225
|
+
{
|
|
226
|
+
for(set<ObjectReaderPtr>::iterator p = _readers.begin(); p != _readers.end(); ++p)
|
|
227
|
+
{
|
|
228
|
+
setMember((*p)->getObject(), (*p)->getSlicedData());
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
void
|
|
233
|
+
IceRuby::SlicedDataUtil::setMember(VALUE obj, const Ice::SlicedDataPtr& slicedData)
|
|
234
|
+
{
|
|
235
|
+
//
|
|
236
|
+
// Create a Ruby equivalent of the SlicedData object.
|
|
237
|
+
//
|
|
238
|
+
|
|
239
|
+
assert(slicedData);
|
|
240
|
+
|
|
241
|
+
if(_slicedDataType == Qnil)
|
|
242
|
+
{
|
|
243
|
+
_slicedDataType = callRuby(rb_path2class, "Ice::SlicedData");
|
|
244
|
+
assert(!NIL_P(_slicedDataType));
|
|
245
|
+
}
|
|
246
|
+
if(_sliceInfoType == Qnil)
|
|
247
|
+
{
|
|
248
|
+
_sliceInfoType = callRuby(rb_path2class, "Ice::SliceInfo");
|
|
249
|
+
assert(!NIL_P(_sliceInfoType));
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
volatile VALUE sd = callRuby(rb_class_new_instance, 0, static_cast<VALUE*>(0), _slicedDataType);
|
|
253
|
+
|
|
254
|
+
Ice::Int sz = slicedData->slices.size();
|
|
255
|
+
volatile VALUE slices = createArray(sz);
|
|
256
|
+
|
|
257
|
+
callRuby(rb_iv_set, sd, "@slices", slices);
|
|
258
|
+
|
|
259
|
+
//
|
|
260
|
+
// Translate each SliceInfo object into its Ruby equivalent.
|
|
261
|
+
//
|
|
262
|
+
int i = 0;
|
|
263
|
+
for(vector<Ice::SliceInfoPtr>::const_iterator p = slicedData->slices.begin(); p != slicedData->slices.end(); ++p)
|
|
264
|
+
{
|
|
265
|
+
volatile VALUE slice = callRuby(rb_class_new_instance, 0, static_cast<VALUE*>(0), _sliceInfoType);
|
|
266
|
+
|
|
267
|
+
RARRAY_PTR(slices)[i++] = slice;
|
|
268
|
+
|
|
269
|
+
//
|
|
270
|
+
// typeId
|
|
271
|
+
//
|
|
272
|
+
volatile VALUE typeId = createString((*p)->typeId);
|
|
273
|
+
callRuby(rb_iv_set, slice, "@typeId", typeId);
|
|
274
|
+
|
|
275
|
+
//
|
|
276
|
+
// compactId
|
|
277
|
+
//
|
|
278
|
+
volatile VALUE compactId = INT2FIX((*p)->compactId);
|
|
279
|
+
callRuby(rb_iv_set, slice, "@compactId", compactId);
|
|
280
|
+
|
|
281
|
+
//
|
|
282
|
+
// bytes
|
|
283
|
+
//
|
|
284
|
+
volatile VALUE bytes = callRuby(rb_str_new, reinterpret_cast<const char*>(&(*p)->bytes[0]), (*p)->bytes.size());
|
|
285
|
+
callRuby(rb_iv_set, slice, "@bytes", bytes);
|
|
286
|
+
|
|
287
|
+
//
|
|
288
|
+
// objects
|
|
289
|
+
//
|
|
290
|
+
volatile VALUE objects = createArray((*p)->objects.size());
|
|
291
|
+
callRuby(rb_iv_set, slice, "@objects", objects);
|
|
292
|
+
|
|
293
|
+
int j = 0;
|
|
294
|
+
for(vector<Ice::ObjectPtr>::iterator q = (*p)->objects.begin(); q != (*p)->objects.end(); ++q)
|
|
295
|
+
{
|
|
296
|
+
//
|
|
297
|
+
// Each element in the objects list is an instance of ObjectReader that wraps a Ruby object.
|
|
298
|
+
//
|
|
299
|
+
assert(*q);
|
|
300
|
+
ObjectReaderPtr r = ObjectReaderPtr::dynamicCast(*q);
|
|
301
|
+
assert(r);
|
|
302
|
+
VALUE o = r->getObject();
|
|
303
|
+
assert(o != Qnil); // Should be non-nil.
|
|
304
|
+
RARRAY_PTR(objects)[j++] = o;
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
//
|
|
308
|
+
// hasOptionalMembers
|
|
309
|
+
//
|
|
310
|
+
callRuby(rb_iv_set, slice, "@hasOptionalMembers", (*p)->hasOptionalMembers ? Qtrue : Qfalse);
|
|
311
|
+
|
|
312
|
+
//
|
|
313
|
+
// isLastSlice
|
|
314
|
+
//
|
|
315
|
+
callRuby(rb_iv_set, slice, "@isLastSlice", (*p)->isLastSlice ? Qtrue : Qfalse);
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
callRuby(rb_iv_set, obj, "@_ice_slicedData", sd);
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
//
|
|
322
|
+
// Instances of preserved class and exception types may have a data member
|
|
323
|
+
// named _ice_slicedData which is an instance of the Ruby class Ice::SlicedData.
|
|
324
|
+
//
|
|
325
|
+
Ice::SlicedDataPtr
|
|
326
|
+
IceRuby::SlicedDataUtil::getMember(VALUE obj, ObjectMap* objectMap)
|
|
327
|
+
{
|
|
328
|
+
Ice::SlicedDataPtr slicedData;
|
|
329
|
+
|
|
330
|
+
if(callRuby(rb_ivar_defined, obj, rb_intern("@_ice_slicedData")) == Qtrue)
|
|
331
|
+
{
|
|
332
|
+
volatile VALUE sd = callRuby(rb_iv_get, obj, "@_ice_slicedData");
|
|
333
|
+
|
|
334
|
+
if(sd != Qnil)
|
|
335
|
+
{
|
|
336
|
+
//
|
|
337
|
+
// The "slices" member is an array of Ice::SliceInfo objects.
|
|
338
|
+
//
|
|
339
|
+
volatile VALUE sl = callRuby(rb_iv_get, sd, "@slices");
|
|
340
|
+
assert(TYPE(sl) == T_ARRAY);
|
|
341
|
+
|
|
342
|
+
Ice::SliceInfoSeq slices;
|
|
343
|
+
|
|
344
|
+
long sz = RARRAY_LEN(sl);
|
|
345
|
+
for(long i = 0; i < sz; ++i)
|
|
346
|
+
{
|
|
347
|
+
volatile VALUE s = RARRAY_PTR(sl)[i];
|
|
348
|
+
|
|
349
|
+
Ice::SliceInfoPtr info = new Ice::SliceInfo;
|
|
350
|
+
|
|
351
|
+
volatile VALUE typeId = callRuby(rb_iv_get, s, "@typeId");
|
|
352
|
+
info->typeId = getString(typeId);
|
|
353
|
+
|
|
354
|
+
volatile VALUE compactId = callRuby(rb_iv_get, s, "@compactId");
|
|
355
|
+
info->compactId = static_cast<Ice::Int>(getInteger(compactId));
|
|
356
|
+
|
|
357
|
+
volatile VALUE bytes = callRuby(rb_iv_get, s, "@bytes");
|
|
358
|
+
assert(TYPE(bytes) == T_STRING);
|
|
359
|
+
const char* str = RSTRING_PTR(bytes);
|
|
360
|
+
const long len = RSTRING_LEN(bytes);
|
|
361
|
+
if(str != 0 && len != 0)
|
|
362
|
+
{
|
|
363
|
+
vector<Ice::Byte> vtmp(reinterpret_cast<const Ice::Byte*>(str),
|
|
364
|
+
reinterpret_cast<const Ice::Byte*>(str + len));
|
|
365
|
+
info->bytes.swap(vtmp);
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
volatile VALUE objects = callRuby(rb_iv_get, s, "@objects");
|
|
369
|
+
assert(TYPE(objects) == T_ARRAY);
|
|
370
|
+
long osz = RARRAY_LEN(objects);
|
|
371
|
+
for(long j = 0; j < osz; ++j)
|
|
372
|
+
{
|
|
373
|
+
VALUE o = RARRAY_PTR(objects)[j];
|
|
374
|
+
|
|
375
|
+
Ice::ObjectPtr writer;
|
|
376
|
+
|
|
377
|
+
ObjectMap::iterator i = objectMap->find(o);
|
|
378
|
+
if(i == objectMap->end())
|
|
379
|
+
{
|
|
380
|
+
writer = new ObjectWriter(o, objectMap);
|
|
381
|
+
objectMap->insert(ObjectMap::value_type(o, writer));
|
|
382
|
+
}
|
|
383
|
+
else
|
|
384
|
+
{
|
|
385
|
+
writer = i->second;
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
info->objects.push_back(writer);
|
|
389
|
+
}
|
|
390
|
+
|
|
391
|
+
volatile VALUE hasOptionalMembers = callRuby(rb_iv_get, s, "@hasOptionalMembers");
|
|
392
|
+
info->hasOptionalMembers = hasOptionalMembers == Qtrue;
|
|
393
|
+
|
|
394
|
+
volatile VALUE isLastSlice = callRuby(rb_iv_get, s, "@isLastSlice");
|
|
395
|
+
info->isLastSlice = isLastSlice == Qtrue;
|
|
396
|
+
|
|
397
|
+
slices.push_back(info);
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
slicedData = new Ice::SlicedData(slices);
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
return slicedData;
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
//
|
|
408
|
+
// UnmarshalCallback implementation.
|
|
409
|
+
//
|
|
410
|
+
IceRuby::UnmarshalCallback::~UnmarshalCallback()
|
|
411
|
+
{
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
//
|
|
415
|
+
// TypeInfo implementation.
|
|
416
|
+
//
|
|
417
|
+
IceRuby::TypeInfo::TypeInfo()
|
|
418
|
+
{
|
|
419
|
+
}
|
|
420
|
+
|
|
421
|
+
bool
|
|
422
|
+
IceRuby::TypeInfo::usesClasses() const
|
|
423
|
+
{
|
|
424
|
+
return false;
|
|
425
|
+
}
|
|
426
|
+
|
|
427
|
+
void
|
|
428
|
+
IceRuby::TypeInfo::unmarshaled(VALUE, VALUE, void*)
|
|
429
|
+
{
|
|
430
|
+
assert(false);
|
|
431
|
+
}
|
|
432
|
+
|
|
433
|
+
void
|
|
434
|
+
IceRuby::TypeInfo::destroy()
|
|
435
|
+
{
|
|
436
|
+
}
|
|
437
|
+
|
|
438
|
+
//
|
|
439
|
+
// PrimitiveInfo implementation.
|
|
440
|
+
//
|
|
441
|
+
IceRuby::PrimitiveInfo::PrimitiveInfo()
|
|
442
|
+
{
|
|
443
|
+
}
|
|
444
|
+
|
|
445
|
+
IceRuby::PrimitiveInfo::PrimitiveInfo(Kind k) : kind(k)
|
|
446
|
+
{
|
|
447
|
+
}
|
|
448
|
+
|
|
449
|
+
string
|
|
450
|
+
IceRuby::PrimitiveInfo::getId() const
|
|
451
|
+
{
|
|
452
|
+
switch(kind)
|
|
453
|
+
{
|
|
454
|
+
case KindBool:
|
|
455
|
+
return "bool";
|
|
456
|
+
case KindByte:
|
|
457
|
+
return "byte";
|
|
458
|
+
case KindShort:
|
|
459
|
+
return "short";
|
|
460
|
+
case KindInt:
|
|
461
|
+
return "int";
|
|
462
|
+
case KindLong:
|
|
463
|
+
return "long";
|
|
464
|
+
case KindFloat:
|
|
465
|
+
return "float";
|
|
466
|
+
case KindDouble:
|
|
467
|
+
return "double";
|
|
468
|
+
case KindString:
|
|
469
|
+
return "string";
|
|
470
|
+
}
|
|
471
|
+
assert(false);
|
|
472
|
+
return string();
|
|
473
|
+
}
|
|
474
|
+
|
|
475
|
+
bool
|
|
476
|
+
IceRuby::PrimitiveInfo::validate(VALUE)
|
|
477
|
+
{
|
|
478
|
+
//
|
|
479
|
+
// Ruby supports type coercion, such that it's technically possible for any
|
|
480
|
+
// value to be coerced to a primitive type. It would be expensive to perform
|
|
481
|
+
// this coercion twice, once to validate and again to marshal, so we skip
|
|
482
|
+
// the validation here.
|
|
483
|
+
//
|
|
484
|
+
return true;
|
|
485
|
+
}
|
|
486
|
+
|
|
487
|
+
bool
|
|
488
|
+
IceRuby::PrimitiveInfo::variableLength() const
|
|
489
|
+
{
|
|
490
|
+
return kind == KindString;
|
|
491
|
+
}
|
|
492
|
+
|
|
493
|
+
int
|
|
494
|
+
IceRuby::PrimitiveInfo::wireSize() const
|
|
495
|
+
{
|
|
496
|
+
switch(kind)
|
|
497
|
+
{
|
|
498
|
+
case KindBool:
|
|
499
|
+
case KindByte:
|
|
500
|
+
return 1;
|
|
501
|
+
case KindShort:
|
|
502
|
+
return 2;
|
|
503
|
+
case KindInt:
|
|
504
|
+
return 4;
|
|
505
|
+
case KindLong:
|
|
506
|
+
return 8;
|
|
507
|
+
case KindFloat:
|
|
508
|
+
return 4;
|
|
509
|
+
case KindDouble:
|
|
510
|
+
return 8;
|
|
511
|
+
case KindString:
|
|
512
|
+
return 1;
|
|
513
|
+
}
|
|
514
|
+
assert(false);
|
|
515
|
+
return 0;
|
|
516
|
+
}
|
|
517
|
+
|
|
518
|
+
Ice::OptionalFormat
|
|
519
|
+
IceRuby::PrimitiveInfo::optionalFormat() const
|
|
520
|
+
{
|
|
521
|
+
switch(kind)
|
|
522
|
+
{
|
|
523
|
+
case KindBool:
|
|
524
|
+
case KindByte:
|
|
525
|
+
return Ice::OptionalFormatF1;
|
|
526
|
+
case KindShort:
|
|
527
|
+
return Ice::OptionalFormatF2;
|
|
528
|
+
case KindInt:
|
|
529
|
+
return Ice::OptionalFormatF4;
|
|
530
|
+
case KindLong:
|
|
531
|
+
return Ice::OptionalFormatF8;
|
|
532
|
+
case KindFloat:
|
|
533
|
+
return Ice::OptionalFormatF4;
|
|
534
|
+
case KindDouble:
|
|
535
|
+
return Ice::OptionalFormatF8;
|
|
536
|
+
case KindString:
|
|
537
|
+
return Ice::OptionalFormatVSize;
|
|
538
|
+
}
|
|
539
|
+
|
|
540
|
+
assert(false);
|
|
541
|
+
return Ice::OptionalFormatF1;
|
|
542
|
+
}
|
|
543
|
+
|
|
544
|
+
void
|
|
545
|
+
IceRuby::PrimitiveInfo::marshal(VALUE p, const Ice::OutputStreamPtr& os, ObjectMap*, bool)
|
|
546
|
+
{
|
|
547
|
+
switch(kind)
|
|
548
|
+
{
|
|
549
|
+
case PrimitiveInfo::KindBool:
|
|
550
|
+
{
|
|
551
|
+
os->write(static_cast<bool>(RTEST(p)));
|
|
552
|
+
break;
|
|
553
|
+
}
|
|
554
|
+
case PrimitiveInfo::KindByte:
|
|
555
|
+
{
|
|
556
|
+
long i = getInteger(p);
|
|
557
|
+
if(i >= 0 && i <= 255)
|
|
558
|
+
{
|
|
559
|
+
os->write(static_cast<Ice::Byte>(i));
|
|
560
|
+
break;
|
|
561
|
+
}
|
|
562
|
+
throw RubyException(rb_eTypeError, "value is out of range for a byte");
|
|
563
|
+
}
|
|
564
|
+
case PrimitiveInfo::KindShort:
|
|
565
|
+
{
|
|
566
|
+
long i = getInteger(p);
|
|
567
|
+
if(i >= SHRT_MIN && i <= SHRT_MAX)
|
|
568
|
+
{
|
|
569
|
+
os->write(static_cast<Ice::Short>(i));
|
|
570
|
+
break;
|
|
571
|
+
}
|
|
572
|
+
throw RubyException(rb_eTypeError, "value is out of range for a short");
|
|
573
|
+
}
|
|
574
|
+
case PrimitiveInfo::KindInt:
|
|
575
|
+
{
|
|
576
|
+
long i = getInteger(p);
|
|
577
|
+
if(i >= INT_MIN && i <= INT_MAX)
|
|
578
|
+
{
|
|
579
|
+
os->write(static_cast<Ice::Int>(i));
|
|
580
|
+
break;
|
|
581
|
+
}
|
|
582
|
+
throw RubyException(rb_eTypeError, "value is out of range for an int");
|
|
583
|
+
}
|
|
584
|
+
case PrimitiveInfo::KindLong:
|
|
585
|
+
{
|
|
586
|
+
os->write(getLong(p));
|
|
587
|
+
break;
|
|
588
|
+
}
|
|
589
|
+
case PrimitiveInfo::KindFloat:
|
|
590
|
+
{
|
|
591
|
+
volatile VALUE val = callRuby(rb_Float, p);
|
|
592
|
+
if(NIL_P(val))
|
|
593
|
+
{
|
|
594
|
+
throw RubyException(rb_eTypeError, "unable to convert value to a float");
|
|
595
|
+
}
|
|
596
|
+
assert(TYPE(val) == T_FLOAT);
|
|
597
|
+
os->write(static_cast<float>(RFLOAT_VALUE(val)));
|
|
598
|
+
break;
|
|
599
|
+
}
|
|
600
|
+
case PrimitiveInfo::KindDouble:
|
|
601
|
+
{
|
|
602
|
+
volatile VALUE val = callRuby(rb_Float, p);
|
|
603
|
+
if(NIL_P(val))
|
|
604
|
+
{
|
|
605
|
+
throw RubyException(rb_eTypeError, "unable to convert value to a double");
|
|
606
|
+
}
|
|
607
|
+
assert(TYPE(val) == T_FLOAT);
|
|
608
|
+
os->write(static_cast<double>(RFLOAT_VALUE(val)));
|
|
609
|
+
break;
|
|
610
|
+
}
|
|
611
|
+
case PrimitiveInfo::KindString:
|
|
612
|
+
{
|
|
613
|
+
string val = getString(p);
|
|
614
|
+
os->write(val);
|
|
615
|
+
break;
|
|
616
|
+
}
|
|
617
|
+
}
|
|
618
|
+
}
|
|
619
|
+
|
|
620
|
+
void
|
|
621
|
+
IceRuby::PrimitiveInfo::unmarshal(const Ice::InputStreamPtr& is, const UnmarshalCallbackPtr& cb, VALUE target,
|
|
622
|
+
void* closure, bool)
|
|
623
|
+
{
|
|
624
|
+
volatile VALUE val = Qnil;
|
|
625
|
+
switch(kind)
|
|
626
|
+
{
|
|
627
|
+
case PrimitiveInfo::KindBool:
|
|
628
|
+
{
|
|
629
|
+
bool b;
|
|
630
|
+
is->read(b);
|
|
631
|
+
val = b ? Qtrue : Qfalse;
|
|
632
|
+
break;
|
|
633
|
+
}
|
|
634
|
+
case PrimitiveInfo::KindByte:
|
|
635
|
+
{
|
|
636
|
+
Ice::Byte b;
|
|
637
|
+
is->read(b);
|
|
638
|
+
val = callRuby(rb_int2inum, b);
|
|
639
|
+
break;
|
|
640
|
+
}
|
|
641
|
+
case PrimitiveInfo::KindShort:
|
|
642
|
+
{
|
|
643
|
+
Ice::Short sh;
|
|
644
|
+
is->read(sh);
|
|
645
|
+
val = callRuby(rb_int2inum, sh);
|
|
646
|
+
break;
|
|
647
|
+
}
|
|
648
|
+
case PrimitiveInfo::KindInt:
|
|
649
|
+
{
|
|
650
|
+
Ice::Int i;
|
|
651
|
+
is->read(i);
|
|
652
|
+
val = callRuby(rb_int2inum, i);
|
|
653
|
+
break;
|
|
654
|
+
}
|
|
655
|
+
case PrimitiveInfo::KindLong:
|
|
656
|
+
{
|
|
657
|
+
Ice::Long l;
|
|
658
|
+
is->read(l);
|
|
659
|
+
val = callRuby(rb_ll2inum, l);
|
|
660
|
+
break;
|
|
661
|
+
}
|
|
662
|
+
case PrimitiveInfo::KindFloat:
|
|
663
|
+
{
|
|
664
|
+
Ice::Float f;
|
|
665
|
+
is->read(f);
|
|
666
|
+
val = callRuby(rb_float_new, f);
|
|
667
|
+
break;
|
|
668
|
+
}
|
|
669
|
+
case PrimitiveInfo::KindDouble:
|
|
670
|
+
{
|
|
671
|
+
Ice::Double d;
|
|
672
|
+
is->read(d);
|
|
673
|
+
val = callRuby(rb_float_new, d);
|
|
674
|
+
break;
|
|
675
|
+
}
|
|
676
|
+
case PrimitiveInfo::KindString:
|
|
677
|
+
{
|
|
678
|
+
string str;
|
|
679
|
+
is->read(str);
|
|
680
|
+
val = createString(str);
|
|
681
|
+
break;
|
|
682
|
+
}
|
|
683
|
+
}
|
|
684
|
+
cb->unmarshaled(val, target, closure);
|
|
685
|
+
}
|
|
686
|
+
|
|
687
|
+
void
|
|
688
|
+
IceRuby::PrimitiveInfo::print(VALUE value, IceUtilInternal::Output& out, PrintObjectHistory*)
|
|
689
|
+
{
|
|
690
|
+
switch(kind)
|
|
691
|
+
{
|
|
692
|
+
case PrimitiveInfo::KindBool:
|
|
693
|
+
{
|
|
694
|
+
out << (RTEST(value) ? "true" : "false");
|
|
695
|
+
break;
|
|
696
|
+
}
|
|
697
|
+
case PrimitiveInfo::KindByte:
|
|
698
|
+
case PrimitiveInfo::KindShort:
|
|
699
|
+
case PrimitiveInfo::KindInt:
|
|
700
|
+
{
|
|
701
|
+
out << getInteger(value);
|
|
702
|
+
break;
|
|
703
|
+
}
|
|
704
|
+
case PrimitiveInfo::KindLong:
|
|
705
|
+
{
|
|
706
|
+
Ice::Long l = getLong(value);
|
|
707
|
+
out << IceUtilInternal::int64ToString(l);
|
|
708
|
+
break;
|
|
709
|
+
}
|
|
710
|
+
case PrimitiveInfo::KindFloat:
|
|
711
|
+
case PrimitiveInfo::KindDouble:
|
|
712
|
+
{
|
|
713
|
+
double d = toDouble(value);
|
|
714
|
+
out << d;
|
|
715
|
+
break;
|
|
716
|
+
}
|
|
717
|
+
case PrimitiveInfo::KindString:
|
|
718
|
+
{
|
|
719
|
+
out << "'" << getString(value) << "'";
|
|
720
|
+
break;
|
|
721
|
+
}
|
|
722
|
+
}
|
|
723
|
+
}
|
|
724
|
+
|
|
725
|
+
double
|
|
726
|
+
IceRuby::PrimitiveInfo::toDouble(VALUE v)
|
|
727
|
+
{
|
|
728
|
+
volatile VALUE val = callRuby(rb_Float, v);
|
|
729
|
+
if(NIL_P(val))
|
|
730
|
+
{
|
|
731
|
+
throw RubyException(rb_eTypeError, "unable to convert value to a double");
|
|
732
|
+
}
|
|
733
|
+
assert(TYPE(val) == T_FLOAT);
|
|
734
|
+
return RFLOAT_VALUE(val);
|
|
735
|
+
}
|
|
736
|
+
|
|
737
|
+
//
|
|
738
|
+
// EnumInfo implementation.
|
|
739
|
+
//
|
|
740
|
+
|
|
741
|
+
namespace
|
|
742
|
+
{
|
|
743
|
+
struct EnumDefinitionIterator : public IceRuby::HashIterator
|
|
744
|
+
{
|
|
745
|
+
EnumDefinitionIterator() :
|
|
746
|
+
maxValue(0)
|
|
747
|
+
{
|
|
748
|
+
}
|
|
749
|
+
|
|
750
|
+
virtual void element(VALUE key, VALUE value)
|
|
751
|
+
{
|
|
752
|
+
const Ice::Int v = static_cast<Ice::Int>(getInteger(key));
|
|
753
|
+
assert(enumerators.find(v) == enumerators.end());
|
|
754
|
+
enumerators[v] = value;
|
|
755
|
+
|
|
756
|
+
if(v > maxValue)
|
|
757
|
+
{
|
|
758
|
+
maxValue = v;
|
|
759
|
+
}
|
|
760
|
+
}
|
|
761
|
+
|
|
762
|
+
Ice::Int maxValue;
|
|
763
|
+
IceRuby::EnumeratorMap enumerators;
|
|
764
|
+
};
|
|
765
|
+
}
|
|
766
|
+
|
|
767
|
+
IceRuby::EnumInfo::EnumInfo(VALUE ident, VALUE t, VALUE e) :
|
|
768
|
+
rubyClass(t), maxValue(0)
|
|
769
|
+
{
|
|
770
|
+
const_cast<string&>(id) = getString(ident);
|
|
771
|
+
|
|
772
|
+
EnumDefinitionIterator iter;
|
|
773
|
+
hashIterate(e, iter);
|
|
774
|
+
|
|
775
|
+
const_cast<Ice::Int&>(maxValue) = iter.maxValue;
|
|
776
|
+
const_cast<EnumeratorMap&>(enumerators) = iter.enumerators;
|
|
777
|
+
}
|
|
778
|
+
|
|
779
|
+
string
|
|
780
|
+
IceRuby::EnumInfo::getId() const
|
|
781
|
+
{
|
|
782
|
+
return id;
|
|
783
|
+
}
|
|
784
|
+
|
|
785
|
+
bool
|
|
786
|
+
IceRuby::EnumInfo::validate(VALUE val)
|
|
787
|
+
{
|
|
788
|
+
return callRuby(rb_obj_is_instance_of, val, rubyClass) == Qtrue;
|
|
789
|
+
}
|
|
790
|
+
|
|
791
|
+
bool
|
|
792
|
+
IceRuby::EnumInfo::variableLength() const
|
|
793
|
+
{
|
|
794
|
+
return true;
|
|
795
|
+
}
|
|
796
|
+
|
|
797
|
+
int
|
|
798
|
+
IceRuby::EnumInfo::wireSize() const
|
|
799
|
+
{
|
|
800
|
+
return 1;
|
|
801
|
+
}
|
|
802
|
+
|
|
803
|
+
Ice::OptionalFormat
|
|
804
|
+
IceRuby::EnumInfo::optionalFormat() const
|
|
805
|
+
{
|
|
806
|
+
return Ice::OptionalFormatSize;
|
|
807
|
+
}
|
|
808
|
+
|
|
809
|
+
void
|
|
810
|
+
IceRuby::EnumInfo::marshal(VALUE p, const Ice::OutputStreamPtr& os, ObjectMap*, bool)
|
|
811
|
+
{
|
|
812
|
+
assert(callRuby(rb_obj_is_instance_of, p, rubyClass) == Qtrue); // validate() should have caught this.
|
|
813
|
+
|
|
814
|
+
//
|
|
815
|
+
// Validate value.
|
|
816
|
+
//
|
|
817
|
+
volatile VALUE val = callRuby(rb_iv_get, p, "@value");
|
|
818
|
+
const Ice::Int ival = static_cast<Ice::Int>(getInteger(val));
|
|
819
|
+
if(enumerators.find(ival) == enumerators.end())
|
|
820
|
+
{
|
|
821
|
+
throw RubyException(rb_eRangeError, "invalid enumerator %ld for enum %s", ival, id.c_str());
|
|
822
|
+
}
|
|
823
|
+
|
|
824
|
+
os->writeEnum(ival, maxValue);
|
|
825
|
+
}
|
|
826
|
+
|
|
827
|
+
void
|
|
828
|
+
IceRuby::EnumInfo::unmarshal(const Ice::InputStreamPtr& is, const UnmarshalCallbackPtr& cb, VALUE target, void* closure,
|
|
829
|
+
bool)
|
|
830
|
+
{
|
|
831
|
+
Ice::Int val = is->readEnum(maxValue);
|
|
832
|
+
|
|
833
|
+
EnumeratorMap::const_iterator p = enumerators.find(val);
|
|
834
|
+
if(p == enumerators.end())
|
|
835
|
+
{
|
|
836
|
+
ostringstream ostr;
|
|
837
|
+
ostr << "invalid enumerator " << val << " for enum " << id;
|
|
838
|
+
throw Ice::MarshalException(__FILE__, __LINE__, ostr.str());
|
|
839
|
+
}
|
|
840
|
+
|
|
841
|
+
cb->unmarshaled(p->second, target, closure);
|
|
842
|
+
}
|
|
843
|
+
|
|
844
|
+
void
|
|
845
|
+
IceRuby::EnumInfo::print(VALUE value, IceUtilInternal::Output& out, PrintObjectHistory*)
|
|
846
|
+
{
|
|
847
|
+
if(!validate(value))
|
|
848
|
+
{
|
|
849
|
+
out << "<invalid value - expected " << id << ">";
|
|
850
|
+
return;
|
|
851
|
+
}
|
|
852
|
+
volatile VALUE str = callRuby(rb_funcall, value, rb_intern("inspect"), 0);
|
|
853
|
+
out << getString(str);
|
|
854
|
+
}
|
|
855
|
+
|
|
856
|
+
//
|
|
857
|
+
// DataMember implementation.
|
|
858
|
+
//
|
|
859
|
+
void
|
|
860
|
+
IceRuby::DataMember::unmarshaled(VALUE val, VALUE target, void*)
|
|
861
|
+
{
|
|
862
|
+
callRuby(rb_ivar_set, target, rubyID, val);
|
|
863
|
+
}
|
|
864
|
+
|
|
865
|
+
static void
|
|
866
|
+
convertDataMembers(VALUE members, DataMemberList& reqMembers, DataMemberList& optMembers, bool allowOptional)
|
|
867
|
+
{
|
|
868
|
+
list<DataMemberPtr> optList;
|
|
869
|
+
|
|
870
|
+
volatile VALUE arr = callRuby(rb_check_array_type, members);
|
|
871
|
+
assert(!NIL_P(arr));
|
|
872
|
+
for(long i = 0; i < RARRAY_LEN(arr); ++i)
|
|
873
|
+
{
|
|
874
|
+
volatile VALUE m = callRuby(rb_check_array_type, RARRAY_PTR(arr)[i]);
|
|
875
|
+
assert(!NIL_P(m));
|
|
876
|
+
assert(RARRAY_LEN(m) == allowOptional ? 4 : 2);
|
|
877
|
+
|
|
878
|
+
DataMemberPtr member = new DataMember;
|
|
879
|
+
|
|
880
|
+
member->name = getString(RARRAY_PTR(m)[0]);
|
|
881
|
+
member->type = getType(RARRAY_PTR(m)[1]);
|
|
882
|
+
string s = "@" + member->name;
|
|
883
|
+
member->rubyID = rb_intern(s.c_str());
|
|
884
|
+
|
|
885
|
+
if(allowOptional)
|
|
886
|
+
{
|
|
887
|
+
member->optional = RTEST(RARRAY_PTR(m)[2]);
|
|
888
|
+
member->tag = static_cast<int>(getInteger(RARRAY_PTR(m)[3]));
|
|
889
|
+
}
|
|
890
|
+
else
|
|
891
|
+
{
|
|
892
|
+
member->optional = false;
|
|
893
|
+
member->tag = 0;
|
|
894
|
+
}
|
|
895
|
+
|
|
896
|
+
if(member->optional)
|
|
897
|
+
{
|
|
898
|
+
optList.push_back(member);
|
|
899
|
+
}
|
|
900
|
+
else
|
|
901
|
+
{
|
|
902
|
+
reqMembers.push_back(member);
|
|
903
|
+
}
|
|
904
|
+
}
|
|
905
|
+
|
|
906
|
+
if(allowOptional)
|
|
907
|
+
{
|
|
908
|
+
class SortFn
|
|
909
|
+
{
|
|
910
|
+
public:
|
|
911
|
+
static bool compare(const DataMemberPtr& lhs, const DataMemberPtr& rhs)
|
|
912
|
+
{
|
|
913
|
+
return lhs->tag < rhs->tag;
|
|
914
|
+
}
|
|
915
|
+
};
|
|
916
|
+
|
|
917
|
+
optList.sort(SortFn::compare);
|
|
918
|
+
copy(optList.begin(), optList.end(), back_inserter(optMembers));
|
|
919
|
+
}
|
|
920
|
+
}
|
|
921
|
+
|
|
922
|
+
//
|
|
923
|
+
// StructInfo implementation.
|
|
924
|
+
//
|
|
925
|
+
IceRuby::StructInfo::StructInfo(VALUE ident, VALUE t, VALUE m) :
|
|
926
|
+
rubyClass(t)
|
|
927
|
+
{
|
|
928
|
+
const_cast<string&>(id) = getString(ident);
|
|
929
|
+
|
|
930
|
+
DataMemberList opt;
|
|
931
|
+
convertDataMembers(m, const_cast<DataMemberList&>(members), opt, false);
|
|
932
|
+
assert(opt.empty());
|
|
933
|
+
|
|
934
|
+
_variableLength = false;
|
|
935
|
+
_wireSize = 0;
|
|
936
|
+
for(DataMemberList::const_iterator p = members.begin(); p != members.end(); ++p)
|
|
937
|
+
{
|
|
938
|
+
if(!_variableLength && (*p)->type->variableLength())
|
|
939
|
+
{
|
|
940
|
+
_variableLength = true;
|
|
941
|
+
}
|
|
942
|
+
_wireSize += (*p)->type->wireSize();
|
|
943
|
+
}
|
|
944
|
+
}
|
|
945
|
+
|
|
946
|
+
string
|
|
947
|
+
IceRuby::StructInfo::getId() const
|
|
948
|
+
{
|
|
949
|
+
return id;
|
|
950
|
+
}
|
|
951
|
+
|
|
952
|
+
bool
|
|
953
|
+
IceRuby::StructInfo::validate(VALUE val)
|
|
954
|
+
{
|
|
955
|
+
return callRuby(rb_obj_is_kind_of, val, rubyClass) == Qtrue;
|
|
956
|
+
}
|
|
957
|
+
|
|
958
|
+
bool
|
|
959
|
+
IceRuby::StructInfo::variableLength() const
|
|
960
|
+
{
|
|
961
|
+
return _variableLength;
|
|
962
|
+
}
|
|
963
|
+
|
|
964
|
+
int
|
|
965
|
+
IceRuby::StructInfo::wireSize() const
|
|
966
|
+
{
|
|
967
|
+
return _wireSize;
|
|
968
|
+
}
|
|
969
|
+
|
|
970
|
+
Ice::OptionalFormat
|
|
971
|
+
IceRuby::StructInfo::optionalFormat() const
|
|
972
|
+
{
|
|
973
|
+
return _variableLength ? Ice::OptionalFormatFSize : Ice::OptionalFormatVSize;
|
|
974
|
+
}
|
|
975
|
+
|
|
976
|
+
bool
|
|
977
|
+
IceRuby::StructInfo::usesClasses() const
|
|
978
|
+
{
|
|
979
|
+
for(DataMemberList::const_iterator p = members.begin(); p != members.end(); ++p)
|
|
980
|
+
{
|
|
981
|
+
if((*p)->type->usesClasses())
|
|
982
|
+
{
|
|
983
|
+
return true;
|
|
984
|
+
}
|
|
985
|
+
}
|
|
986
|
+
|
|
987
|
+
return false;
|
|
988
|
+
}
|
|
989
|
+
|
|
990
|
+
void
|
|
991
|
+
IceRuby::StructInfo::marshal(VALUE p, const Ice::OutputStreamPtr& os, ObjectMap* objectMap, bool optional)
|
|
992
|
+
{
|
|
993
|
+
assert(callRuby(rb_obj_is_kind_of, p, rubyClass) == Qtrue); // validate() should have caught this.
|
|
994
|
+
|
|
995
|
+
Ice::OutputStream::size_type sizePos = -1;
|
|
996
|
+
if(optional)
|
|
997
|
+
{
|
|
998
|
+
if(_variableLength)
|
|
999
|
+
{
|
|
1000
|
+
sizePos = os->startSize();
|
|
1001
|
+
}
|
|
1002
|
+
else
|
|
1003
|
+
{
|
|
1004
|
+
os->writeSize(_wireSize);
|
|
1005
|
+
}
|
|
1006
|
+
}
|
|
1007
|
+
|
|
1008
|
+
for(DataMemberList::const_iterator q = members.begin(); q != members.end(); ++q)
|
|
1009
|
+
{
|
|
1010
|
+
DataMemberPtr member = *q;
|
|
1011
|
+
volatile VALUE val = callRuby(rb_ivar_get, p, member->rubyID);
|
|
1012
|
+
if(!member->type->validate(val))
|
|
1013
|
+
{
|
|
1014
|
+
throw RubyException(rb_eTypeError, "invalid value for %s member `%s'", const_cast<char*>(id.c_str()),
|
|
1015
|
+
member->name.c_str());
|
|
1016
|
+
}
|
|
1017
|
+
member->type->marshal(val, os, objectMap, false);
|
|
1018
|
+
}
|
|
1019
|
+
|
|
1020
|
+
if(optional && _variableLength)
|
|
1021
|
+
{
|
|
1022
|
+
os->endSize(sizePos);
|
|
1023
|
+
}
|
|
1024
|
+
}
|
|
1025
|
+
|
|
1026
|
+
void
|
|
1027
|
+
IceRuby::StructInfo::unmarshal(const Ice::InputStreamPtr& is, const UnmarshalCallbackPtr& cb, VALUE target,
|
|
1028
|
+
void* closure, bool optional)
|
|
1029
|
+
{
|
|
1030
|
+
volatile VALUE obj = callRuby(rb_class_new_instance, 0, static_cast<VALUE*>(0), rubyClass);
|
|
1031
|
+
|
|
1032
|
+
if(optional)
|
|
1033
|
+
{
|
|
1034
|
+
if(_variableLength)
|
|
1035
|
+
{
|
|
1036
|
+
is->skip(4);
|
|
1037
|
+
}
|
|
1038
|
+
else
|
|
1039
|
+
{
|
|
1040
|
+
is->skipSize();
|
|
1041
|
+
}
|
|
1042
|
+
}
|
|
1043
|
+
|
|
1044
|
+
for(DataMemberList::const_iterator q = members.begin(); q != members.end(); ++q)
|
|
1045
|
+
{
|
|
1046
|
+
DataMemberPtr member = *q;
|
|
1047
|
+
member->type->unmarshal(is, member, obj, 0, false);
|
|
1048
|
+
}
|
|
1049
|
+
|
|
1050
|
+
cb->unmarshaled(obj, target, closure);
|
|
1051
|
+
}
|
|
1052
|
+
|
|
1053
|
+
void
|
|
1054
|
+
IceRuby::StructInfo::print(VALUE value, IceUtilInternal::Output& out, PrintObjectHistory* history)
|
|
1055
|
+
{
|
|
1056
|
+
if(!validate(value))
|
|
1057
|
+
{
|
|
1058
|
+
out << "<invalid value - expected " << id << ">";
|
|
1059
|
+
return;
|
|
1060
|
+
}
|
|
1061
|
+
out.sb();
|
|
1062
|
+
for(DataMemberList::const_iterator q = members.begin(); q != members.end(); ++q)
|
|
1063
|
+
{
|
|
1064
|
+
DataMemberPtr member = *q;
|
|
1065
|
+
out << nl << member->name << " = ";
|
|
1066
|
+
if(callRuby(rb_ivar_defined, value, member->rubyID) == Qfalse)
|
|
1067
|
+
{
|
|
1068
|
+
out << "<not defined>";
|
|
1069
|
+
}
|
|
1070
|
+
else
|
|
1071
|
+
{
|
|
1072
|
+
volatile VALUE val = callRuby(rb_ivar_get, value, member->rubyID);
|
|
1073
|
+
member->type->print(val, out, history);
|
|
1074
|
+
}
|
|
1075
|
+
}
|
|
1076
|
+
out.eb();
|
|
1077
|
+
}
|
|
1078
|
+
|
|
1079
|
+
void
|
|
1080
|
+
IceRuby::StructInfo::destroy()
|
|
1081
|
+
{
|
|
1082
|
+
for(DataMemberList::const_iterator p = members.begin(); p != members.end(); ++p)
|
|
1083
|
+
{
|
|
1084
|
+
(*p)->type->destroy();
|
|
1085
|
+
}
|
|
1086
|
+
const_cast<DataMemberList&>(members).clear();
|
|
1087
|
+
}
|
|
1088
|
+
|
|
1089
|
+
//
|
|
1090
|
+
// SequenceInfo implementation.
|
|
1091
|
+
//
|
|
1092
|
+
IceRuby::SequenceInfo::SequenceInfo(VALUE ident, VALUE t)
|
|
1093
|
+
{
|
|
1094
|
+
const_cast<string&>(id) = getString(ident);
|
|
1095
|
+
const_cast<TypeInfoPtr&>(elementType) = getType(t);
|
|
1096
|
+
}
|
|
1097
|
+
|
|
1098
|
+
string
|
|
1099
|
+
IceRuby::SequenceInfo::getId() const
|
|
1100
|
+
{
|
|
1101
|
+
return id;
|
|
1102
|
+
}
|
|
1103
|
+
|
|
1104
|
+
bool
|
|
1105
|
+
IceRuby::SequenceInfo::validate(VALUE val)
|
|
1106
|
+
{
|
|
1107
|
+
//
|
|
1108
|
+
// Accept nil, an array, a string (for sequence<byte>), or any object that responds to to_ary.
|
|
1109
|
+
//
|
|
1110
|
+
if(NIL_P(val) || TYPE(val) == T_ARRAY)
|
|
1111
|
+
{
|
|
1112
|
+
return true;
|
|
1113
|
+
}
|
|
1114
|
+
if(TYPE(val) == T_STRING)
|
|
1115
|
+
{
|
|
1116
|
+
PrimitiveInfoPtr pi = PrimitiveInfoPtr::dynamicCast(elementType);
|
|
1117
|
+
if(pi && pi->kind == PrimitiveInfo::KindByte)
|
|
1118
|
+
{
|
|
1119
|
+
return true;
|
|
1120
|
+
}
|
|
1121
|
+
}
|
|
1122
|
+
ID id = rb_intern("to_ary");
|
|
1123
|
+
return callRuby(rb_respond_to, val, id) != 0;
|
|
1124
|
+
}
|
|
1125
|
+
|
|
1126
|
+
bool
|
|
1127
|
+
IceRuby::SequenceInfo::variableLength() const
|
|
1128
|
+
{
|
|
1129
|
+
return true;
|
|
1130
|
+
}
|
|
1131
|
+
|
|
1132
|
+
int
|
|
1133
|
+
IceRuby::SequenceInfo::wireSize() const
|
|
1134
|
+
{
|
|
1135
|
+
return 1;
|
|
1136
|
+
}
|
|
1137
|
+
|
|
1138
|
+
Ice::OptionalFormat
|
|
1139
|
+
IceRuby::SequenceInfo::optionalFormat() const
|
|
1140
|
+
{
|
|
1141
|
+
return elementType->variableLength() ? Ice::OptionalFormatFSize : Ice::OptionalFormatVSize;
|
|
1142
|
+
}
|
|
1143
|
+
|
|
1144
|
+
bool
|
|
1145
|
+
IceRuby::SequenceInfo::usesClasses() const
|
|
1146
|
+
{
|
|
1147
|
+
return elementType->usesClasses();
|
|
1148
|
+
}
|
|
1149
|
+
|
|
1150
|
+
void
|
|
1151
|
+
IceRuby::SequenceInfo::marshal(VALUE p, const Ice::OutputStreamPtr& os, ObjectMap* objectMap, bool optional)
|
|
1152
|
+
{
|
|
1153
|
+
PrimitiveInfoPtr pi = PrimitiveInfoPtr::dynamicCast(elementType);
|
|
1154
|
+
|
|
1155
|
+
volatile VALUE arr = Qnil;
|
|
1156
|
+
|
|
1157
|
+
Ice::OutputStream::size_type sizePos = -1;
|
|
1158
|
+
if(optional)
|
|
1159
|
+
{
|
|
1160
|
+
if(elementType->variableLength())
|
|
1161
|
+
{
|
|
1162
|
+
sizePos = os->startSize();
|
|
1163
|
+
}
|
|
1164
|
+
else if(elementType->wireSize() > 1)
|
|
1165
|
+
{
|
|
1166
|
+
//
|
|
1167
|
+
// Determine the sequence size.
|
|
1168
|
+
//
|
|
1169
|
+
int sz = 0;
|
|
1170
|
+
if(!NIL_P(p))
|
|
1171
|
+
{
|
|
1172
|
+
if(TYPE(p) == T_ARRAY)
|
|
1173
|
+
{
|
|
1174
|
+
sz = static_cast<int>(RARRAY_LEN(p));
|
|
1175
|
+
}
|
|
1176
|
+
else
|
|
1177
|
+
{
|
|
1178
|
+
arr = callRuby(rb_Array, p);
|
|
1179
|
+
if(NIL_P(arr))
|
|
1180
|
+
{
|
|
1181
|
+
throw RubyException(rb_eTypeError, "unable to convert value to an array");
|
|
1182
|
+
}
|
|
1183
|
+
sz = static_cast<int>(RARRAY_LEN(arr));
|
|
1184
|
+
}
|
|
1185
|
+
}
|
|
1186
|
+
os->writeSize(sz == 0 ? 1 : sz * elementType->wireSize() + (sz > 254 ? 5 : 1));
|
|
1187
|
+
}
|
|
1188
|
+
}
|
|
1189
|
+
|
|
1190
|
+
if(NIL_P(p))
|
|
1191
|
+
{
|
|
1192
|
+
os->writeSize(0);
|
|
1193
|
+
}
|
|
1194
|
+
else if(pi)
|
|
1195
|
+
{
|
|
1196
|
+
marshalPrimitiveSequence(pi, p, os);
|
|
1197
|
+
}
|
|
1198
|
+
else
|
|
1199
|
+
{
|
|
1200
|
+
if(NIL_P(arr))
|
|
1201
|
+
{
|
|
1202
|
+
arr = callRuby(rb_Array, p);
|
|
1203
|
+
if(NIL_P(arr))
|
|
1204
|
+
{
|
|
1205
|
+
throw RubyException(rb_eTypeError, "unable to convert value to an array");
|
|
1206
|
+
}
|
|
1207
|
+
}
|
|
1208
|
+
|
|
1209
|
+
long sz = RARRAY_LEN(arr);
|
|
1210
|
+
os->writeSize(static_cast<Ice::Int>(sz));
|
|
1211
|
+
for(long i = 0; i < sz; ++i)
|
|
1212
|
+
{
|
|
1213
|
+
if(!elementType->validate(RARRAY_PTR(arr)[i]))
|
|
1214
|
+
{
|
|
1215
|
+
throw RubyException(rb_eTypeError, "invalid value for element %ld of `%s'", i,
|
|
1216
|
+
const_cast<char*>(id.c_str()));
|
|
1217
|
+
}
|
|
1218
|
+
elementType->marshal(RARRAY_PTR(arr)[i], os, objectMap, false);
|
|
1219
|
+
}
|
|
1220
|
+
}
|
|
1221
|
+
|
|
1222
|
+
if(optional && elementType->variableLength())
|
|
1223
|
+
{
|
|
1224
|
+
os->endSize(sizePos);
|
|
1225
|
+
}
|
|
1226
|
+
}
|
|
1227
|
+
|
|
1228
|
+
void
|
|
1229
|
+
IceRuby::SequenceInfo::unmarshal(const Ice::InputStreamPtr& is, const UnmarshalCallbackPtr& cb, VALUE target,
|
|
1230
|
+
void* closure, bool optional)
|
|
1231
|
+
{
|
|
1232
|
+
if(optional)
|
|
1233
|
+
{
|
|
1234
|
+
if(elementType->variableLength())
|
|
1235
|
+
{
|
|
1236
|
+
is->skip(4);
|
|
1237
|
+
}
|
|
1238
|
+
else if(elementType->wireSize() > 1)
|
|
1239
|
+
{
|
|
1240
|
+
is->skipSize();
|
|
1241
|
+
}
|
|
1242
|
+
}
|
|
1243
|
+
|
|
1244
|
+
PrimitiveInfoPtr pi = PrimitiveInfoPtr::dynamicCast(elementType);
|
|
1245
|
+
if(pi)
|
|
1246
|
+
{
|
|
1247
|
+
unmarshalPrimitiveSequence(pi, is, cb, target, closure);
|
|
1248
|
+
return;
|
|
1249
|
+
}
|
|
1250
|
+
|
|
1251
|
+
Ice::Int sz = is->readSize();
|
|
1252
|
+
volatile VALUE arr = createArray(sz);
|
|
1253
|
+
|
|
1254
|
+
for(Ice::Int i = 0; i < sz; ++i)
|
|
1255
|
+
{
|
|
1256
|
+
void* cl = reinterpret_cast<void*>(i);
|
|
1257
|
+
elementType->unmarshal(is, this, arr, cl, false);
|
|
1258
|
+
}
|
|
1259
|
+
|
|
1260
|
+
cb->unmarshaled(arr, target, closure);
|
|
1261
|
+
}
|
|
1262
|
+
|
|
1263
|
+
void
|
|
1264
|
+
IceRuby::SequenceInfo::unmarshaled(VALUE val, VALUE target, void* closure)
|
|
1265
|
+
{
|
|
1266
|
+
#ifdef ICE_64
|
|
1267
|
+
long i = static_cast<long>(reinterpret_cast<long long>(closure));
|
|
1268
|
+
#else
|
|
1269
|
+
long i = reinterpret_cast<long>(closure);
|
|
1270
|
+
#endif
|
|
1271
|
+
RARRAY_PTR(target)[i] = val;
|
|
1272
|
+
}
|
|
1273
|
+
|
|
1274
|
+
void
|
|
1275
|
+
IceRuby::SequenceInfo::print(VALUE value, IceUtilInternal::Output& out, PrintObjectHistory* history)
|
|
1276
|
+
{
|
|
1277
|
+
if(!validate(value))
|
|
1278
|
+
{
|
|
1279
|
+
out << "<invalid value - expected " << id << ">";
|
|
1280
|
+
return;
|
|
1281
|
+
}
|
|
1282
|
+
|
|
1283
|
+
if(NIL_P(value))
|
|
1284
|
+
{
|
|
1285
|
+
out << "{}";
|
|
1286
|
+
}
|
|
1287
|
+
else
|
|
1288
|
+
{
|
|
1289
|
+
if(TYPE(value) == T_STRING)
|
|
1290
|
+
{
|
|
1291
|
+
PrimitiveInfoPtr pi = PrimitiveInfoPtr::dynamicCast(elementType);
|
|
1292
|
+
if(pi && pi->kind == PrimitiveInfo::KindByte)
|
|
1293
|
+
{
|
|
1294
|
+
out << "'" << escapeString(getString(value)) << "'";
|
|
1295
|
+
return;
|
|
1296
|
+
}
|
|
1297
|
+
}
|
|
1298
|
+
|
|
1299
|
+
volatile VALUE arr = callRuby(rb_Array, value);
|
|
1300
|
+
if(NIL_P(arr))
|
|
1301
|
+
{
|
|
1302
|
+
throw RubyException(rb_eTypeError, "unable to convert value to an array");
|
|
1303
|
+
}
|
|
1304
|
+
|
|
1305
|
+
long sz = RARRAY_LEN(arr);
|
|
1306
|
+
|
|
1307
|
+
out.sb();
|
|
1308
|
+
for(long i = 0; i < sz; ++i)
|
|
1309
|
+
{
|
|
1310
|
+
out << nl << '[' << i << "] = ";
|
|
1311
|
+
elementType->print(RARRAY_PTR(arr)[i], out, history);
|
|
1312
|
+
}
|
|
1313
|
+
out.eb();
|
|
1314
|
+
}
|
|
1315
|
+
}
|
|
1316
|
+
|
|
1317
|
+
void
|
|
1318
|
+
IceRuby::SequenceInfo::destroy()
|
|
1319
|
+
{
|
|
1320
|
+
if(elementType)
|
|
1321
|
+
{
|
|
1322
|
+
elementType->destroy();
|
|
1323
|
+
const_cast<TypeInfoPtr&>(elementType) = 0;
|
|
1324
|
+
}
|
|
1325
|
+
}
|
|
1326
|
+
|
|
1327
|
+
void
|
|
1328
|
+
IceRuby::SequenceInfo::marshalPrimitiveSequence(const PrimitiveInfoPtr& pi, VALUE p, const Ice::OutputStreamPtr& os)
|
|
1329
|
+
{
|
|
1330
|
+
volatile VALUE arr = Qnil;
|
|
1331
|
+
volatile VALUE str = Qnil;
|
|
1332
|
+
|
|
1333
|
+
//
|
|
1334
|
+
// Accept a string or an array for sequence<byte>.
|
|
1335
|
+
//
|
|
1336
|
+
if(pi->kind == PrimitiveInfo::KindByte)
|
|
1337
|
+
{
|
|
1338
|
+
if(TYPE(p) == T_STRING)
|
|
1339
|
+
{
|
|
1340
|
+
str = p;
|
|
1341
|
+
}
|
|
1342
|
+
else
|
|
1343
|
+
{
|
|
1344
|
+
arr = callRuby(rb_Array, p);
|
|
1345
|
+
if(NIL_P(arr))
|
|
1346
|
+
{
|
|
1347
|
+
throw RubyException(rb_eTypeError, "argument is not a string or an array");
|
|
1348
|
+
}
|
|
1349
|
+
}
|
|
1350
|
+
}
|
|
1351
|
+
else
|
|
1352
|
+
{
|
|
1353
|
+
arr = callRuby(rb_Array, p);
|
|
1354
|
+
if(NIL_P(arr))
|
|
1355
|
+
{
|
|
1356
|
+
throw RubyException(rb_eTypeError, "unable to convert value to an array");
|
|
1357
|
+
}
|
|
1358
|
+
}
|
|
1359
|
+
|
|
1360
|
+
switch(pi->kind)
|
|
1361
|
+
{
|
|
1362
|
+
case PrimitiveInfo::KindBool:
|
|
1363
|
+
{
|
|
1364
|
+
long sz = RARRAY_LEN(arr);
|
|
1365
|
+
Ice::BoolSeq seq(sz);
|
|
1366
|
+
for(long i = 0; i < sz; ++i)
|
|
1367
|
+
{
|
|
1368
|
+
seq[i] = RTEST(RARRAY_PTR(arr)[i]);
|
|
1369
|
+
}
|
|
1370
|
+
os->write(seq);
|
|
1371
|
+
break;
|
|
1372
|
+
}
|
|
1373
|
+
case PrimitiveInfo::KindByte:
|
|
1374
|
+
{
|
|
1375
|
+
if(!NIL_P(str))
|
|
1376
|
+
{
|
|
1377
|
+
const char* s = RSTRING_PTR(str);
|
|
1378
|
+
const long len = RSTRING_LEN(str);
|
|
1379
|
+
if(s == 0 || len == 0)
|
|
1380
|
+
{
|
|
1381
|
+
os->write(Ice::Int(0));
|
|
1382
|
+
}
|
|
1383
|
+
else
|
|
1384
|
+
{
|
|
1385
|
+
os->write(reinterpret_cast<const Ice::Byte*>(s), reinterpret_cast<const Ice::Byte*>(s + len));
|
|
1386
|
+
}
|
|
1387
|
+
}
|
|
1388
|
+
else
|
|
1389
|
+
{
|
|
1390
|
+
long sz = RARRAY_LEN(arr);
|
|
1391
|
+
Ice::ByteSeq seq(sz);
|
|
1392
|
+
for(long i = 0; i < sz; ++i)
|
|
1393
|
+
{
|
|
1394
|
+
long val = getInteger(RARRAY_PTR(arr)[i]);
|
|
1395
|
+
if(val < 0 || val > 255)
|
|
1396
|
+
{
|
|
1397
|
+
throw RubyException(rb_eTypeError, "invalid value for element %ld of sequence<byte>", i);
|
|
1398
|
+
}
|
|
1399
|
+
seq[i] = static_cast<Ice::Byte>(val);
|
|
1400
|
+
}
|
|
1401
|
+
os->write(&seq[0], &seq[0] + seq.size());
|
|
1402
|
+
}
|
|
1403
|
+
break;
|
|
1404
|
+
}
|
|
1405
|
+
case PrimitiveInfo::KindShort:
|
|
1406
|
+
{
|
|
1407
|
+
long sz = RARRAY_LEN(arr);
|
|
1408
|
+
Ice::ShortSeq seq(sz);
|
|
1409
|
+
for(long i = 0; i < sz; ++i)
|
|
1410
|
+
{
|
|
1411
|
+
long val = getInteger(RARRAY_PTR(arr)[i]);
|
|
1412
|
+
if(val < SHRT_MIN || val > SHRT_MAX)
|
|
1413
|
+
{
|
|
1414
|
+
throw RubyException(rb_eTypeError, "invalid value for element %ld of sequence<short>", i);
|
|
1415
|
+
}
|
|
1416
|
+
seq[i] = static_cast<Ice::Short>(val);
|
|
1417
|
+
}
|
|
1418
|
+
os->write(&seq[0], &seq[0] + seq.size());
|
|
1419
|
+
break;
|
|
1420
|
+
}
|
|
1421
|
+
case PrimitiveInfo::KindInt:
|
|
1422
|
+
{
|
|
1423
|
+
long sz = RARRAY_LEN(arr);
|
|
1424
|
+
Ice::IntSeq seq(sz);
|
|
1425
|
+
for(long i = 0; i < sz; ++i)
|
|
1426
|
+
{
|
|
1427
|
+
long val = getInteger(RARRAY_PTR(arr)[i]);
|
|
1428
|
+
if(val < INT_MIN || val > INT_MAX)
|
|
1429
|
+
{
|
|
1430
|
+
throw RubyException(rb_eTypeError, "invalid value for element %ld of sequence<int>", i);
|
|
1431
|
+
}
|
|
1432
|
+
seq[i] = static_cast<Ice::Int>(val);
|
|
1433
|
+
}
|
|
1434
|
+
os->write(&seq[0], &seq[0] + seq.size());
|
|
1435
|
+
break;
|
|
1436
|
+
}
|
|
1437
|
+
case PrimitiveInfo::KindLong:
|
|
1438
|
+
{
|
|
1439
|
+
long sz = RARRAY_LEN(arr);
|
|
1440
|
+
Ice::LongSeq seq(sz);
|
|
1441
|
+
for(long i = 0; i < sz; ++i)
|
|
1442
|
+
{
|
|
1443
|
+
seq[i] = getLong(RARRAY_PTR(arr)[i]);
|
|
1444
|
+
}
|
|
1445
|
+
os->write(&seq[0], &seq[0] + seq.size());
|
|
1446
|
+
break;
|
|
1447
|
+
}
|
|
1448
|
+
case PrimitiveInfo::KindFloat:
|
|
1449
|
+
{
|
|
1450
|
+
long sz = RARRAY_LEN(arr);
|
|
1451
|
+
Ice::FloatSeq seq(sz);
|
|
1452
|
+
for(long i = 0; i < sz; ++i)
|
|
1453
|
+
{
|
|
1454
|
+
volatile VALUE v = callRuby(rb_Float, RARRAY_PTR(arr)[i]);
|
|
1455
|
+
if(NIL_P(v))
|
|
1456
|
+
{
|
|
1457
|
+
throw RubyException(rb_eTypeError, "unable to convert array element %ld to a float", i);
|
|
1458
|
+
}
|
|
1459
|
+
assert(TYPE(v) == T_FLOAT);
|
|
1460
|
+
seq[i] = static_cast<Ice::Float>(RFLOAT_VALUE(v));
|
|
1461
|
+
}
|
|
1462
|
+
os->write(&seq[0], &seq[0] + seq.size());
|
|
1463
|
+
break;
|
|
1464
|
+
}
|
|
1465
|
+
case PrimitiveInfo::KindDouble:
|
|
1466
|
+
{
|
|
1467
|
+
long sz = RARRAY_LEN(arr);
|
|
1468
|
+
Ice::DoubleSeq seq(sz);
|
|
1469
|
+
for(long i = 0; i < sz; ++i)
|
|
1470
|
+
{
|
|
1471
|
+
volatile VALUE v = callRuby(rb_Float, RARRAY_PTR(arr)[i]);
|
|
1472
|
+
if(NIL_P(v))
|
|
1473
|
+
{
|
|
1474
|
+
throw RubyException(rb_eTypeError, "unable to convert array element %ld to a double", i);
|
|
1475
|
+
}
|
|
1476
|
+
assert(TYPE(v) == T_FLOAT);
|
|
1477
|
+
seq[i] = RFLOAT_VALUE(v);
|
|
1478
|
+
}
|
|
1479
|
+
os->write(&seq[0], &seq[0] + seq.size());
|
|
1480
|
+
break;
|
|
1481
|
+
}
|
|
1482
|
+
case PrimitiveInfo::KindString:
|
|
1483
|
+
{
|
|
1484
|
+
long sz = RARRAY_LEN(arr);
|
|
1485
|
+
Ice::StringSeq seq(sz);
|
|
1486
|
+
for(long i = 0; i < sz; ++i)
|
|
1487
|
+
{
|
|
1488
|
+
seq[i] = getString(RARRAY_PTR(arr)[i]);
|
|
1489
|
+
}
|
|
1490
|
+
os->write(seq, true);
|
|
1491
|
+
break;
|
|
1492
|
+
}
|
|
1493
|
+
}
|
|
1494
|
+
}
|
|
1495
|
+
|
|
1496
|
+
void
|
|
1497
|
+
IceRuby::SequenceInfo::unmarshalPrimitiveSequence(const PrimitiveInfoPtr& pi, const Ice::InputStreamPtr& is,
|
|
1498
|
+
const UnmarshalCallbackPtr& cb, VALUE target, void* closure)
|
|
1499
|
+
{
|
|
1500
|
+
volatile VALUE result = Qnil;
|
|
1501
|
+
|
|
1502
|
+
switch(pi->kind)
|
|
1503
|
+
{
|
|
1504
|
+
case PrimitiveInfo::KindBool:
|
|
1505
|
+
{
|
|
1506
|
+
pair<const bool*, const bool*> p;
|
|
1507
|
+
IceUtil::ScopedArray<bool> sa;
|
|
1508
|
+
is->read(p, sa);
|
|
1509
|
+
long sz = static_cast<long>(p.second - p.first);
|
|
1510
|
+
result = createArray(sz);
|
|
1511
|
+
|
|
1512
|
+
if(sz > 0)
|
|
1513
|
+
{
|
|
1514
|
+
for(long i = 0; i < sz; ++i)
|
|
1515
|
+
{
|
|
1516
|
+
RARRAY_PTR(result)[i] = p.first[i] ? Qtrue : Qfalse;
|
|
1517
|
+
}
|
|
1518
|
+
}
|
|
1519
|
+
break;
|
|
1520
|
+
}
|
|
1521
|
+
case PrimitiveInfo::KindByte:
|
|
1522
|
+
{
|
|
1523
|
+
pair<const Ice::Byte*, const Ice::Byte*> p;
|
|
1524
|
+
is->read(p);
|
|
1525
|
+
result = callRuby(rb_str_new, reinterpret_cast<const char*>(p.first), static_cast<long>(p.second - p.first));
|
|
1526
|
+
break;
|
|
1527
|
+
}
|
|
1528
|
+
case PrimitiveInfo::KindShort:
|
|
1529
|
+
{
|
|
1530
|
+
pair<const Ice::Short*, const Ice::Short*> p;
|
|
1531
|
+
IceUtil::ScopedArray<Ice::Short> sa;
|
|
1532
|
+
is->read(p, sa);
|
|
1533
|
+
long sz = static_cast<long>(p.second - p.first);
|
|
1534
|
+
result = createArray(sz);
|
|
1535
|
+
|
|
1536
|
+
if(sz > 0)
|
|
1537
|
+
{
|
|
1538
|
+
for(long i = 0; i < sz; ++i)
|
|
1539
|
+
{
|
|
1540
|
+
RARRAY_PTR(result)[i] = INT2FIX(p.first[i]);
|
|
1541
|
+
}
|
|
1542
|
+
}
|
|
1543
|
+
break;
|
|
1544
|
+
}
|
|
1545
|
+
case PrimitiveInfo::KindInt:
|
|
1546
|
+
{
|
|
1547
|
+
pair<const Ice::Int*, const Ice::Int*> p;
|
|
1548
|
+
IceUtil::ScopedArray<Ice::Int> sa;
|
|
1549
|
+
is->read(p, sa);
|
|
1550
|
+
long sz = static_cast<long>(p.second - p.first);
|
|
1551
|
+
result = createArray(sz);
|
|
1552
|
+
|
|
1553
|
+
if(sz > 0)
|
|
1554
|
+
{
|
|
1555
|
+
for(long i = 0; i < sz; ++i)
|
|
1556
|
+
{
|
|
1557
|
+
RARRAY_PTR(result)[i] = INT2FIX(p.first[i]);
|
|
1558
|
+
}
|
|
1559
|
+
}
|
|
1560
|
+
break;
|
|
1561
|
+
}
|
|
1562
|
+
case PrimitiveInfo::KindLong:
|
|
1563
|
+
{
|
|
1564
|
+
pair<const Ice::Long*, const Ice::Long*> p;
|
|
1565
|
+
IceUtil::ScopedArray<Ice::Long> sa;
|
|
1566
|
+
is->read(p, sa);
|
|
1567
|
+
long sz = static_cast<long>(p.second - p.first);
|
|
1568
|
+
result = createArray(sz);
|
|
1569
|
+
|
|
1570
|
+
if(sz > 0)
|
|
1571
|
+
{
|
|
1572
|
+
for(long i = 0; i < sz; ++i)
|
|
1573
|
+
{
|
|
1574
|
+
RARRAY_PTR(result)[i] = callRuby(rb_ll2inum, p.first[i]);
|
|
1575
|
+
}
|
|
1576
|
+
}
|
|
1577
|
+
break;
|
|
1578
|
+
}
|
|
1579
|
+
case PrimitiveInfo::KindFloat:
|
|
1580
|
+
{
|
|
1581
|
+
pair<const Ice::Float*, const Ice::Float*> p;
|
|
1582
|
+
IceUtil::ScopedArray<Ice::Float> sa;
|
|
1583
|
+
is->read(p, sa);
|
|
1584
|
+
long sz = static_cast<long>(p.second - p.first);
|
|
1585
|
+
result = createArray(sz);
|
|
1586
|
+
|
|
1587
|
+
if(sz > 0)
|
|
1588
|
+
{
|
|
1589
|
+
for(long i = 0; i < sz; ++i)
|
|
1590
|
+
{
|
|
1591
|
+
RARRAY_PTR(result)[i] = callRuby(rb_float_new, p.first[i]);
|
|
1592
|
+
}
|
|
1593
|
+
}
|
|
1594
|
+
break;
|
|
1595
|
+
}
|
|
1596
|
+
case PrimitiveInfo::KindDouble:
|
|
1597
|
+
{
|
|
1598
|
+
pair<const Ice::Double*, const Ice::Double*> p;
|
|
1599
|
+
IceUtil::ScopedArray<Ice::Double> sa;
|
|
1600
|
+
is->read(p, sa);
|
|
1601
|
+
long sz = static_cast<long>(p.second - p.first);
|
|
1602
|
+
result = createArray(sz);
|
|
1603
|
+
|
|
1604
|
+
if(sz > 0)
|
|
1605
|
+
{
|
|
1606
|
+
for(long i = 0; i < sz; ++i)
|
|
1607
|
+
{
|
|
1608
|
+
RARRAY_PTR(result)[i] = callRuby(rb_float_new, p.first[i]);
|
|
1609
|
+
}
|
|
1610
|
+
}
|
|
1611
|
+
break;
|
|
1612
|
+
}
|
|
1613
|
+
case PrimitiveInfo::KindString:
|
|
1614
|
+
{
|
|
1615
|
+
Ice::StringSeq seq;
|
|
1616
|
+
is->read(seq, true);
|
|
1617
|
+
long sz = static_cast<long>(seq.size());
|
|
1618
|
+
result = createArray(sz);
|
|
1619
|
+
|
|
1620
|
+
if(sz > 0)
|
|
1621
|
+
{
|
|
1622
|
+
for(long i = 0; i < sz; ++i)
|
|
1623
|
+
{
|
|
1624
|
+
RARRAY_PTR(result)[i] = createString(seq[i]);
|
|
1625
|
+
}
|
|
1626
|
+
}
|
|
1627
|
+
break;
|
|
1628
|
+
}
|
|
1629
|
+
}
|
|
1630
|
+
cb->unmarshaled(result, target, closure);
|
|
1631
|
+
}
|
|
1632
|
+
|
|
1633
|
+
//
|
|
1634
|
+
// DictionaryInfo implementation.
|
|
1635
|
+
//
|
|
1636
|
+
IceRuby::DictionaryInfo::DictionaryInfo(VALUE ident, VALUE kt, VALUE vt)
|
|
1637
|
+
{
|
|
1638
|
+
const_cast<string&>(id) = getString(ident);
|
|
1639
|
+
const_cast<TypeInfoPtr&>(keyType) = getType(kt);
|
|
1640
|
+
const_cast<TypeInfoPtr&>(valueType) = getType(vt);
|
|
1641
|
+
|
|
1642
|
+
_variableLength = keyType->variableLength() || valueType->variableLength();
|
|
1643
|
+
_wireSize = keyType->wireSize() + valueType->wireSize();
|
|
1644
|
+
}
|
|
1645
|
+
|
|
1646
|
+
string
|
|
1647
|
+
IceRuby::DictionaryInfo::getId() const
|
|
1648
|
+
{
|
|
1649
|
+
return id;
|
|
1650
|
+
}
|
|
1651
|
+
|
|
1652
|
+
bool
|
|
1653
|
+
IceRuby::DictionaryInfo::validate(VALUE val)
|
|
1654
|
+
{
|
|
1655
|
+
//
|
|
1656
|
+
// Accept nil, a hash, or any object that responds to to_hash.
|
|
1657
|
+
//
|
|
1658
|
+
if(NIL_P(val) || TYPE(val) == T_HASH)
|
|
1659
|
+
{
|
|
1660
|
+
return true;
|
|
1661
|
+
}
|
|
1662
|
+
ID id = rb_intern("to_hash");
|
|
1663
|
+
return callRuby(rb_respond_to, val, id) != 0;
|
|
1664
|
+
}
|
|
1665
|
+
|
|
1666
|
+
bool
|
|
1667
|
+
IceRuby::DictionaryInfo::variableLength() const
|
|
1668
|
+
{
|
|
1669
|
+
return true;
|
|
1670
|
+
}
|
|
1671
|
+
|
|
1672
|
+
int
|
|
1673
|
+
IceRuby::DictionaryInfo::wireSize() const
|
|
1674
|
+
{
|
|
1675
|
+
return 1;
|
|
1676
|
+
}
|
|
1677
|
+
|
|
1678
|
+
Ice::OptionalFormat
|
|
1679
|
+
IceRuby::DictionaryInfo::optionalFormat() const
|
|
1680
|
+
{
|
|
1681
|
+
return _variableLength ? Ice::OptionalFormatFSize : Ice::OptionalFormatVSize;
|
|
1682
|
+
}
|
|
1683
|
+
|
|
1684
|
+
bool
|
|
1685
|
+
IceRuby::DictionaryInfo::usesClasses() const
|
|
1686
|
+
{
|
|
1687
|
+
return valueType->usesClasses();
|
|
1688
|
+
}
|
|
1689
|
+
|
|
1690
|
+
namespace
|
|
1691
|
+
{
|
|
1692
|
+
struct DictionaryMarshalIterator : public IceRuby::HashIterator
|
|
1693
|
+
{
|
|
1694
|
+
DictionaryMarshalIterator(const IceRuby::DictionaryInfoPtr& d, const Ice::OutputStreamPtr o, IceRuby::ObjectMap* m)
|
|
1695
|
+
: dict(d), os(o), objectMap(m)
|
|
1696
|
+
{
|
|
1697
|
+
}
|
|
1698
|
+
|
|
1699
|
+
virtual void element(VALUE key, VALUE value)
|
|
1700
|
+
{
|
|
1701
|
+
dict->marshalElement(key, value, os, objectMap);
|
|
1702
|
+
}
|
|
1703
|
+
|
|
1704
|
+
IceRuby::DictionaryInfoPtr dict;
|
|
1705
|
+
Ice::OutputStreamPtr os;
|
|
1706
|
+
IceRuby::ObjectMap* objectMap;
|
|
1707
|
+
};
|
|
1708
|
+
}
|
|
1709
|
+
|
|
1710
|
+
void
|
|
1711
|
+
IceRuby::DictionaryInfo::marshal(VALUE p, const Ice::OutputStreamPtr& os, ObjectMap* objectMap, bool optional)
|
|
1712
|
+
{
|
|
1713
|
+
volatile VALUE hash = Qnil;
|
|
1714
|
+
|
|
1715
|
+
if(!NIL_P(p))
|
|
1716
|
+
{
|
|
1717
|
+
hash = callRuby(rb_convert_type, p, T_HASH, "Hash", "to_hash");
|
|
1718
|
+
if(NIL_P(hash))
|
|
1719
|
+
{
|
|
1720
|
+
throw RubyException(rb_eTypeError, "unable to convert value to a hash");
|
|
1721
|
+
}
|
|
1722
|
+
}
|
|
1723
|
+
|
|
1724
|
+
int sz = 0;
|
|
1725
|
+
if(!NIL_P(hash))
|
|
1726
|
+
{
|
|
1727
|
+
sz = RHASH_SIZE(hash);
|
|
1728
|
+
}
|
|
1729
|
+
|
|
1730
|
+
Ice::OutputStream::size_type sizePos = 0;
|
|
1731
|
+
if(optional)
|
|
1732
|
+
{
|
|
1733
|
+
if(_variableLength)
|
|
1734
|
+
{
|
|
1735
|
+
sizePos = os->startSize();
|
|
1736
|
+
}
|
|
1737
|
+
else
|
|
1738
|
+
{
|
|
1739
|
+
os->writeSize(sz == 0 ? 1 : sz * _wireSize + (sz > 254 ? 5 : 1));
|
|
1740
|
+
}
|
|
1741
|
+
}
|
|
1742
|
+
|
|
1743
|
+
if(NIL_P(hash))
|
|
1744
|
+
{
|
|
1745
|
+
os->writeSize(0);
|
|
1746
|
+
}
|
|
1747
|
+
else
|
|
1748
|
+
{
|
|
1749
|
+
os->writeSize(sz);
|
|
1750
|
+
if(sz > 0)
|
|
1751
|
+
{
|
|
1752
|
+
DictionaryMarshalIterator iter(this, os, objectMap);
|
|
1753
|
+
hashIterate(hash, iter);
|
|
1754
|
+
}
|
|
1755
|
+
}
|
|
1756
|
+
|
|
1757
|
+
if(optional && _variableLength)
|
|
1758
|
+
{
|
|
1759
|
+
os->endSize(sizePos);
|
|
1760
|
+
}
|
|
1761
|
+
}
|
|
1762
|
+
|
|
1763
|
+
void
|
|
1764
|
+
IceRuby::DictionaryInfo::marshalElement(VALUE key, VALUE value, const Ice::OutputStreamPtr& os, ObjectMap* objectMap)
|
|
1765
|
+
{
|
|
1766
|
+
if(!keyType->validate(key))
|
|
1767
|
+
{
|
|
1768
|
+
throw RubyException(rb_eTypeError, "invalid key in `%s' element", const_cast<char*>(id.c_str()));
|
|
1769
|
+
}
|
|
1770
|
+
|
|
1771
|
+
if(!valueType->validate(value))
|
|
1772
|
+
{
|
|
1773
|
+
throw RubyException(rb_eTypeError, "invalid value in `%s' element", const_cast<char*>(id.c_str()));
|
|
1774
|
+
}
|
|
1775
|
+
|
|
1776
|
+
keyType->marshal(key, os, objectMap, false);
|
|
1777
|
+
valueType->marshal(value, os, objectMap, false);
|
|
1778
|
+
}
|
|
1779
|
+
|
|
1780
|
+
void
|
|
1781
|
+
IceRuby::DictionaryInfo::unmarshal(const Ice::InputStreamPtr& is, const UnmarshalCallbackPtr& cb, VALUE target,
|
|
1782
|
+
void* closure, bool optional)
|
|
1783
|
+
{
|
|
1784
|
+
if(optional)
|
|
1785
|
+
{
|
|
1786
|
+
if(_variableLength)
|
|
1787
|
+
{
|
|
1788
|
+
is->skip(4);
|
|
1789
|
+
}
|
|
1790
|
+
else
|
|
1791
|
+
{
|
|
1792
|
+
is->skipSize();
|
|
1793
|
+
}
|
|
1794
|
+
}
|
|
1795
|
+
|
|
1796
|
+
volatile VALUE hash = callRuby(rb_hash_new);
|
|
1797
|
+
|
|
1798
|
+
KeyCallbackPtr keyCB = new KeyCallback;
|
|
1799
|
+
keyCB->key = Qnil;
|
|
1800
|
+
|
|
1801
|
+
Ice::Int sz = is->readSize();
|
|
1802
|
+
for(Ice::Int i = 0; i < sz; ++i)
|
|
1803
|
+
{
|
|
1804
|
+
//
|
|
1805
|
+
// A dictionary key cannot be a class (or contain one), so the key must be
|
|
1806
|
+
// available immediately.
|
|
1807
|
+
//
|
|
1808
|
+
keyType->unmarshal(is, keyCB, Qnil, 0, false);
|
|
1809
|
+
assert(!NIL_P(keyCB->key));
|
|
1810
|
+
|
|
1811
|
+
//
|
|
1812
|
+
// The callback will set the dictionary entry with the unmarshaled value,
|
|
1813
|
+
// so we pass it the key.
|
|
1814
|
+
//
|
|
1815
|
+
void* cl = reinterpret_cast<void*>(keyCB->key);
|
|
1816
|
+
valueType->unmarshal(is, this, hash, cl, false);
|
|
1817
|
+
}
|
|
1818
|
+
|
|
1819
|
+
cb->unmarshaled(hash, target, closure);
|
|
1820
|
+
}
|
|
1821
|
+
|
|
1822
|
+
void
|
|
1823
|
+
IceRuby::DictionaryInfo::unmarshaled(VALUE val, VALUE target, void* closure)
|
|
1824
|
+
{
|
|
1825
|
+
volatile VALUE key = reinterpret_cast<VALUE>(closure);
|
|
1826
|
+
callRuby(rb_hash_aset, target, key, val);
|
|
1827
|
+
}
|
|
1828
|
+
|
|
1829
|
+
namespace
|
|
1830
|
+
{
|
|
1831
|
+
struct DictionaryPrintIterator : public IceRuby::HashIterator
|
|
1832
|
+
{
|
|
1833
|
+
DictionaryPrintIterator(const DictionaryInfoPtr& d, IceUtilInternal::Output& o, PrintObjectHistory* h) :
|
|
1834
|
+
dict(d), out(o), history(h)
|
|
1835
|
+
{
|
|
1836
|
+
}
|
|
1837
|
+
|
|
1838
|
+
virtual void element(VALUE key, VALUE value)
|
|
1839
|
+
{
|
|
1840
|
+
dict->printElement(key, value, out, history);
|
|
1841
|
+
}
|
|
1842
|
+
|
|
1843
|
+
IceRuby::DictionaryInfoPtr dict;
|
|
1844
|
+
IceUtilInternal::Output& out;
|
|
1845
|
+
IceRuby::PrintObjectHistory* history;
|
|
1846
|
+
};
|
|
1847
|
+
}
|
|
1848
|
+
|
|
1849
|
+
void
|
|
1850
|
+
IceRuby::DictionaryInfo::print(VALUE value, IceUtilInternal::Output& out, PrintObjectHistory* history)
|
|
1851
|
+
{
|
|
1852
|
+
if(!validate(value))
|
|
1853
|
+
{
|
|
1854
|
+
out << "<invalid value - expected " << id << ">";
|
|
1855
|
+
return;
|
|
1856
|
+
}
|
|
1857
|
+
|
|
1858
|
+
if(NIL_P(value))
|
|
1859
|
+
{
|
|
1860
|
+
out << "{}";
|
|
1861
|
+
}
|
|
1862
|
+
else
|
|
1863
|
+
{
|
|
1864
|
+
volatile VALUE hash = callRuby(rb_convert_type, value, T_HASH, "Hash", "to_hash");
|
|
1865
|
+
if(NIL_P(hash))
|
|
1866
|
+
{
|
|
1867
|
+
throw RubyException(rb_eTypeError, "unable to convert value to a hash");
|
|
1868
|
+
}
|
|
1869
|
+
|
|
1870
|
+
if(RHASH_SIZE(hash) == 0)
|
|
1871
|
+
{
|
|
1872
|
+
out << "{}";
|
|
1873
|
+
return;
|
|
1874
|
+
}
|
|
1875
|
+
|
|
1876
|
+
out.sb();
|
|
1877
|
+
DictionaryPrintIterator iter(this, out, history);
|
|
1878
|
+
hashIterate(hash, iter);
|
|
1879
|
+
out.eb();
|
|
1880
|
+
}
|
|
1881
|
+
}
|
|
1882
|
+
|
|
1883
|
+
void
|
|
1884
|
+
IceRuby::DictionaryInfo::printElement(VALUE key, VALUE value, IceUtilInternal::Output& out, PrintObjectHistory* history)
|
|
1885
|
+
{
|
|
1886
|
+
out << nl << "key = ";
|
|
1887
|
+
keyType->print(key, out, history);
|
|
1888
|
+
out << nl << "value = ";
|
|
1889
|
+
valueType->print(value, out, history);
|
|
1890
|
+
}
|
|
1891
|
+
|
|
1892
|
+
void
|
|
1893
|
+
IceRuby::DictionaryInfo::KeyCallback::unmarshaled(VALUE val, VALUE, void*)
|
|
1894
|
+
{
|
|
1895
|
+
key = val;
|
|
1896
|
+
}
|
|
1897
|
+
|
|
1898
|
+
void
|
|
1899
|
+
IceRuby::DictionaryInfo::destroy()
|
|
1900
|
+
{
|
|
1901
|
+
if(keyType)
|
|
1902
|
+
{
|
|
1903
|
+
keyType->destroy();
|
|
1904
|
+
const_cast<TypeInfoPtr&>(keyType) = 0;
|
|
1905
|
+
}
|
|
1906
|
+
if(valueType)
|
|
1907
|
+
{
|
|
1908
|
+
valueType->destroy();
|
|
1909
|
+
const_cast<TypeInfoPtr&>(valueType) = 0;
|
|
1910
|
+
}
|
|
1911
|
+
}
|
|
1912
|
+
|
|
1913
|
+
//
|
|
1914
|
+
// ClassInfo implementation.
|
|
1915
|
+
//
|
|
1916
|
+
IceRuby::ClassInfo::ClassInfo(VALUE ident, bool loc) :
|
|
1917
|
+
compactId(-1), isBase(false), isLocal(loc), isAbstract(false), preserve(false), rubyClass(Qnil), typeObj(Qnil),
|
|
1918
|
+
defined(false)
|
|
1919
|
+
{
|
|
1920
|
+
const_cast<string&>(id) = getString(ident);
|
|
1921
|
+
if(isLocal)
|
|
1922
|
+
{
|
|
1923
|
+
const_cast<bool&>(isBase) = id == "::Ice::LocalObject";
|
|
1924
|
+
}
|
|
1925
|
+
else
|
|
1926
|
+
{
|
|
1927
|
+
const_cast<bool&>(isBase) = id == Ice::Object::ice_staticId();
|
|
1928
|
+
}
|
|
1929
|
+
const_cast<VALUE&>(typeObj) = createType(this);
|
|
1930
|
+
}
|
|
1931
|
+
|
|
1932
|
+
void
|
|
1933
|
+
IceRuby::ClassInfo::define(VALUE t, VALUE compact, VALUE abstr, VALUE pres, VALUE b, VALUE i, VALUE m)
|
|
1934
|
+
{
|
|
1935
|
+
if(!NIL_P(b))
|
|
1936
|
+
{
|
|
1937
|
+
const_cast<ClassInfoPtr&>(base) = ClassInfoPtr::dynamicCast(getType(b));
|
|
1938
|
+
assert(base);
|
|
1939
|
+
}
|
|
1940
|
+
|
|
1941
|
+
const_cast<Ice::Int&>(compactId) = static_cast<Ice::Int>(getInteger(compact));
|
|
1942
|
+
const_cast<bool&>(isAbstract) = RTEST(abstr);
|
|
1943
|
+
const_cast<bool&>(preserve) = RTEST(pres);
|
|
1944
|
+
|
|
1945
|
+
long n;
|
|
1946
|
+
volatile VALUE arr;
|
|
1947
|
+
|
|
1948
|
+
arr = callRuby(rb_check_array_type, i);
|
|
1949
|
+
assert(!NIL_P(arr));
|
|
1950
|
+
for(n = 0; n < RARRAY_LEN(arr); ++n)
|
|
1951
|
+
{
|
|
1952
|
+
ClassInfoPtr iface = ClassInfoPtr::dynamicCast(getType(RARRAY_PTR(arr)[n]));
|
|
1953
|
+
assert(iface);
|
|
1954
|
+
const_cast<ClassInfoList&>(interfaces).push_back(iface);
|
|
1955
|
+
}
|
|
1956
|
+
|
|
1957
|
+
convertDataMembers(m, const_cast<DataMemberList&>(members), const_cast<DataMemberList&>(optionalMembers), true);
|
|
1958
|
+
|
|
1959
|
+
const_cast<VALUE&>(rubyClass) = t;
|
|
1960
|
+
const_cast<bool&>(defined) = true;
|
|
1961
|
+
}
|
|
1962
|
+
|
|
1963
|
+
string
|
|
1964
|
+
IceRuby::ClassInfo::getId() const
|
|
1965
|
+
{
|
|
1966
|
+
return id;
|
|
1967
|
+
}
|
|
1968
|
+
|
|
1969
|
+
bool
|
|
1970
|
+
IceRuby::ClassInfo::validate(VALUE val)
|
|
1971
|
+
{
|
|
1972
|
+
if(NIL_P(val))
|
|
1973
|
+
{
|
|
1974
|
+
return true;
|
|
1975
|
+
}
|
|
1976
|
+
|
|
1977
|
+
//
|
|
1978
|
+
// We consider an object to be an instance of this class if its class contains
|
|
1979
|
+
// an ICE_TYPE constant that refers to this class, or a subclass of this class.
|
|
1980
|
+
//
|
|
1981
|
+
volatile VALUE cls = CLASS_OF(val);
|
|
1982
|
+
volatile VALUE type = Qnil;
|
|
1983
|
+
try
|
|
1984
|
+
{
|
|
1985
|
+
type = callRuby(rb_const_get, cls, rb_intern("ICE_TYPE"));
|
|
1986
|
+
}
|
|
1987
|
+
catch(const RubyException& ex)
|
|
1988
|
+
{
|
|
1989
|
+
if(callRuby(rb_obj_is_instance_of, ex.ex, rb_eNameError) == Qtrue)
|
|
1990
|
+
{
|
|
1991
|
+
//
|
|
1992
|
+
// The ICE_TYPE constant will be missing from an instance of LocalObject
|
|
1993
|
+
// if it does not implement a user-defined type. This means the user
|
|
1994
|
+
// could potentially pass any kind of object; there isn't much we can do
|
|
1995
|
+
// since LocalObject maps to the base object type.
|
|
1996
|
+
//
|
|
1997
|
+
return id == "::Ice::LocalObject";
|
|
1998
|
+
}
|
|
1999
|
+
else
|
|
2000
|
+
{
|
|
2001
|
+
throw;
|
|
2002
|
+
}
|
|
2003
|
+
}
|
|
2004
|
+
assert(!NIL_P(type));
|
|
2005
|
+
ClassInfoPtr info = ClassInfoPtr::dynamicCast(getType(type));
|
|
2006
|
+
assert(info);
|
|
2007
|
+
return info->isA(this);
|
|
2008
|
+
}
|
|
2009
|
+
|
|
2010
|
+
bool
|
|
2011
|
+
IceRuby::ClassInfo::variableLength() const
|
|
2012
|
+
{
|
|
2013
|
+
return true;
|
|
2014
|
+
}
|
|
2015
|
+
|
|
2016
|
+
int
|
|
2017
|
+
IceRuby::ClassInfo::wireSize() const
|
|
2018
|
+
{
|
|
2019
|
+
return 1;
|
|
2020
|
+
}
|
|
2021
|
+
|
|
2022
|
+
Ice::OptionalFormat
|
|
2023
|
+
IceRuby::ClassInfo::optionalFormat() const
|
|
2024
|
+
{
|
|
2025
|
+
return Ice::OptionalFormatClass;
|
|
2026
|
+
}
|
|
2027
|
+
|
|
2028
|
+
bool
|
|
2029
|
+
IceRuby::ClassInfo::usesClasses() const
|
|
2030
|
+
{
|
|
2031
|
+
return true;
|
|
2032
|
+
}
|
|
2033
|
+
|
|
2034
|
+
void
|
|
2035
|
+
IceRuby::ClassInfo::marshal(VALUE p, const Ice::OutputStreamPtr& os, ObjectMap* objectMap, bool)
|
|
2036
|
+
{
|
|
2037
|
+
if(!defined)
|
|
2038
|
+
{
|
|
2039
|
+
throw RubyException(rb_eRuntimeError, "class %s is declared but not defined", id.c_str());
|
|
2040
|
+
}
|
|
2041
|
+
|
|
2042
|
+
if(NIL_P(p))
|
|
2043
|
+
{
|
|
2044
|
+
os->writeObject(0);
|
|
2045
|
+
return;
|
|
2046
|
+
}
|
|
2047
|
+
|
|
2048
|
+
//
|
|
2049
|
+
// Ice::ObjectWriter is a subclass of Ice::Object that wraps a Ruby object for marshaling.
|
|
2050
|
+
// It is possible that this Ruby object has already been marshaled, therefore we first must
|
|
2051
|
+
// check the object map to see if this object is present. If so, we use the existing ObjectWriter,
|
|
2052
|
+
// otherwise we create a new one.
|
|
2053
|
+
//
|
|
2054
|
+
Ice::ObjectPtr writer;
|
|
2055
|
+
assert(objectMap);
|
|
2056
|
+
ObjectMap::iterator q = objectMap->find(p);
|
|
2057
|
+
if(q == objectMap->end())
|
|
2058
|
+
{
|
|
2059
|
+
writer = new ObjectWriter(p, objectMap);
|
|
2060
|
+
objectMap->insert(ObjectMap::value_type(p, writer));
|
|
2061
|
+
}
|
|
2062
|
+
else
|
|
2063
|
+
{
|
|
2064
|
+
writer = q->second;
|
|
2065
|
+
}
|
|
2066
|
+
|
|
2067
|
+
//
|
|
2068
|
+
// Give the writer to the stream. The stream will eventually call write() on it.
|
|
2069
|
+
//
|
|
2070
|
+
os->writeObject(writer);
|
|
2071
|
+
}
|
|
2072
|
+
|
|
2073
|
+
void
|
|
2074
|
+
IceRuby::ClassInfo::unmarshal(const Ice::InputStreamPtr& is, const UnmarshalCallbackPtr& cb, VALUE target,
|
|
2075
|
+
void* closure, bool)
|
|
2076
|
+
{
|
|
2077
|
+
if(!defined)
|
|
2078
|
+
{
|
|
2079
|
+
throw RubyException(rb_eRuntimeError, "class %s is declared but not defined", id.c_str());
|
|
2080
|
+
}
|
|
2081
|
+
|
|
2082
|
+
is->readObject(new ReadObjectCallback(this, cb, target, closure));
|
|
2083
|
+
}
|
|
2084
|
+
|
|
2085
|
+
void
|
|
2086
|
+
IceRuby::ClassInfo::print(VALUE value, IceUtilInternal::Output& out, PrintObjectHistory* history)
|
|
2087
|
+
{
|
|
2088
|
+
if(!validate(value))
|
|
2089
|
+
{
|
|
2090
|
+
out << "<invalid value - expected " << id << ">";
|
|
2091
|
+
return;
|
|
2092
|
+
}
|
|
2093
|
+
|
|
2094
|
+
if(NIL_P(value))
|
|
2095
|
+
{
|
|
2096
|
+
out << "<nil>";
|
|
2097
|
+
}
|
|
2098
|
+
else
|
|
2099
|
+
{
|
|
2100
|
+
map<VALUE, int>::iterator q = history->objects.find(value);
|
|
2101
|
+
if(q != history->objects.end())
|
|
2102
|
+
{
|
|
2103
|
+
out << "<object #" << q->second << ">";
|
|
2104
|
+
}
|
|
2105
|
+
else
|
|
2106
|
+
{
|
|
2107
|
+
volatile VALUE cls = CLASS_OF(value);
|
|
2108
|
+
volatile VALUE type = Qnil;
|
|
2109
|
+
ClassInfoPtr info;
|
|
2110
|
+
try
|
|
2111
|
+
{
|
|
2112
|
+
type = callRuby(rb_const_get, cls, rb_intern("ICE_TYPE"));
|
|
2113
|
+
info = ClassInfoPtr::dynamicCast(getType(type));
|
|
2114
|
+
}
|
|
2115
|
+
catch(const RubyException& ex)
|
|
2116
|
+
{
|
|
2117
|
+
if(callRuby(rb_obj_is_instance_of, ex.ex, rb_eNameError) == Qtrue)
|
|
2118
|
+
{
|
|
2119
|
+
//
|
|
2120
|
+
// The ICE_TYPE constant will be missing from an instance of LocalObject
|
|
2121
|
+
// if it does not implement a user-defined type. This means the user
|
|
2122
|
+
// could potentially pass any kind of object; there isn't much we can do
|
|
2123
|
+
// since LocalObject maps to the base object type.
|
|
2124
|
+
//
|
|
2125
|
+
if(id == "::Ice::LocalObject")
|
|
2126
|
+
{
|
|
2127
|
+
info = this;
|
|
2128
|
+
}
|
|
2129
|
+
else
|
|
2130
|
+
{
|
|
2131
|
+
out << "<invalid value - expected " << id << ">";
|
|
2132
|
+
return;
|
|
2133
|
+
}
|
|
2134
|
+
}
|
|
2135
|
+
else
|
|
2136
|
+
{
|
|
2137
|
+
throw;
|
|
2138
|
+
}
|
|
2139
|
+
}
|
|
2140
|
+
assert(info);
|
|
2141
|
+
out << "object #" << history->index << " (" << info->id << ')';
|
|
2142
|
+
history->objects.insert(map<VALUE, int>::value_type(value, history->index));
|
|
2143
|
+
++history->index;
|
|
2144
|
+
out.sb();
|
|
2145
|
+
info->printMembers(value, out, history);
|
|
2146
|
+
out.eb();
|
|
2147
|
+
}
|
|
2148
|
+
}
|
|
2149
|
+
}
|
|
2150
|
+
|
|
2151
|
+
void
|
|
2152
|
+
IceRuby::ClassInfo::destroy()
|
|
2153
|
+
{
|
|
2154
|
+
const_cast<ClassInfoPtr&>(base) = 0;
|
|
2155
|
+
const_cast<ClassInfoList&>(interfaces).clear();
|
|
2156
|
+
if(!members.empty())
|
|
2157
|
+
{
|
|
2158
|
+
DataMemberList ml = members;
|
|
2159
|
+
const_cast<DataMemberList&>(members).clear();
|
|
2160
|
+
for(DataMemberList::iterator p = ml.begin(); p != ml.end(); ++p)
|
|
2161
|
+
{
|
|
2162
|
+
(*p)->type->destroy();
|
|
2163
|
+
}
|
|
2164
|
+
}
|
|
2165
|
+
}
|
|
2166
|
+
|
|
2167
|
+
void
|
|
2168
|
+
IceRuby::ClassInfo::printMembers(VALUE value, IceUtilInternal::Output& out, PrintObjectHistory* history)
|
|
2169
|
+
{
|
|
2170
|
+
if(base)
|
|
2171
|
+
{
|
|
2172
|
+
base->printMembers(value, out, history);
|
|
2173
|
+
}
|
|
2174
|
+
|
|
2175
|
+
DataMemberList::const_iterator q;
|
|
2176
|
+
|
|
2177
|
+
for(q = members.begin(); q != members.end(); ++q)
|
|
2178
|
+
{
|
|
2179
|
+
DataMemberPtr member = *q;
|
|
2180
|
+
out << nl << member->name << " = ";
|
|
2181
|
+
if(callRuby(rb_ivar_defined, value, member->rubyID) == Qfalse)
|
|
2182
|
+
{
|
|
2183
|
+
out << "<not defined>";
|
|
2184
|
+
}
|
|
2185
|
+
else
|
|
2186
|
+
{
|
|
2187
|
+
volatile VALUE val = callRuby(rb_ivar_get, value, member->rubyID);
|
|
2188
|
+
member->type->print(val, out, history);
|
|
2189
|
+
}
|
|
2190
|
+
}
|
|
2191
|
+
|
|
2192
|
+
for(q = optionalMembers.begin(); q != optionalMembers.end(); ++q)
|
|
2193
|
+
{
|
|
2194
|
+
DataMemberPtr member = *q;
|
|
2195
|
+
out << nl << member->name << " = ";
|
|
2196
|
+
if(callRuby(rb_ivar_defined, value, member->rubyID) == Qfalse)
|
|
2197
|
+
{
|
|
2198
|
+
out << "<not defined>";
|
|
2199
|
+
}
|
|
2200
|
+
else
|
|
2201
|
+
{
|
|
2202
|
+
volatile VALUE val = callRuby(rb_ivar_get, value, member->rubyID);
|
|
2203
|
+
if(val == Unset)
|
|
2204
|
+
{
|
|
2205
|
+
out << "<unset>";
|
|
2206
|
+
}
|
|
2207
|
+
else
|
|
2208
|
+
{
|
|
2209
|
+
member->type->print(val, out, history);
|
|
2210
|
+
}
|
|
2211
|
+
}
|
|
2212
|
+
}
|
|
2213
|
+
}
|
|
2214
|
+
|
|
2215
|
+
bool
|
|
2216
|
+
IceRuby::ClassInfo::isA(const ClassInfoPtr& info)
|
|
2217
|
+
{
|
|
2218
|
+
//
|
|
2219
|
+
// Return true if this class has an is-a relationship with info.
|
|
2220
|
+
//
|
|
2221
|
+
if(info->isBase && isLocal == info->isLocal)
|
|
2222
|
+
{
|
|
2223
|
+
return true;
|
|
2224
|
+
}
|
|
2225
|
+
else if(this == info.get())
|
|
2226
|
+
{
|
|
2227
|
+
return true;
|
|
2228
|
+
}
|
|
2229
|
+
else if(base && base->isA(info))
|
|
2230
|
+
{
|
|
2231
|
+
return true;
|
|
2232
|
+
}
|
|
2233
|
+
else if(!interfaces.empty())
|
|
2234
|
+
{
|
|
2235
|
+
for(ClassInfoList::const_iterator p = interfaces.begin(); p != interfaces.end(); ++p)
|
|
2236
|
+
{
|
|
2237
|
+
if((*p)->isA(info))
|
|
2238
|
+
{
|
|
2239
|
+
return true;
|
|
2240
|
+
}
|
|
2241
|
+
}
|
|
2242
|
+
}
|
|
2243
|
+
|
|
2244
|
+
return false;
|
|
2245
|
+
}
|
|
2246
|
+
|
|
2247
|
+
//
|
|
2248
|
+
// ProxyInfo implementation.
|
|
2249
|
+
//
|
|
2250
|
+
IceRuby::ProxyInfo::ProxyInfo(VALUE ident) :
|
|
2251
|
+
rubyClass(Qnil), typeObj(Qnil)
|
|
2252
|
+
{
|
|
2253
|
+
const_cast<string&>(id) = getString(ident);
|
|
2254
|
+
const_cast<VALUE&>(typeObj) = createType(this);
|
|
2255
|
+
}
|
|
2256
|
+
|
|
2257
|
+
void
|
|
2258
|
+
IceRuby::ProxyInfo::define(VALUE t, VALUE i)
|
|
2259
|
+
{
|
|
2260
|
+
const_cast<VALUE&>(rubyClass) = t;
|
|
2261
|
+
const_cast<ClassInfoPtr&>(classInfo) = ClassInfoPtr::dynamicCast(getType(i));
|
|
2262
|
+
assert(classInfo);
|
|
2263
|
+
}
|
|
2264
|
+
|
|
2265
|
+
string
|
|
2266
|
+
IceRuby::ProxyInfo::getId() const
|
|
2267
|
+
{
|
|
2268
|
+
return id;
|
|
2269
|
+
}
|
|
2270
|
+
|
|
2271
|
+
bool
|
|
2272
|
+
IceRuby::ProxyInfo::validate(VALUE val)
|
|
2273
|
+
{
|
|
2274
|
+
if(!NIL_P(val))
|
|
2275
|
+
{
|
|
2276
|
+
if(!checkProxy(val))
|
|
2277
|
+
{
|
|
2278
|
+
return false;
|
|
2279
|
+
}
|
|
2280
|
+
volatile VALUE cls = CLASS_OF(val);
|
|
2281
|
+
volatile VALUE type = callRuby(rb_const_get, cls, rb_intern("ICE_TYPE"));
|
|
2282
|
+
assert(!NIL_P(type));
|
|
2283
|
+
ProxyInfoPtr info = ProxyInfoPtr::dynamicCast(getType(type));
|
|
2284
|
+
assert(info);
|
|
2285
|
+
return info->classInfo->isA(classInfo);
|
|
2286
|
+
}
|
|
2287
|
+
return true;
|
|
2288
|
+
}
|
|
2289
|
+
|
|
2290
|
+
bool
|
|
2291
|
+
IceRuby::ProxyInfo::variableLength() const
|
|
2292
|
+
{
|
|
2293
|
+
return true;
|
|
2294
|
+
}
|
|
2295
|
+
|
|
2296
|
+
int
|
|
2297
|
+
IceRuby::ProxyInfo::wireSize() const
|
|
2298
|
+
{
|
|
2299
|
+
return 1;
|
|
2300
|
+
}
|
|
2301
|
+
|
|
2302
|
+
Ice::OptionalFormat
|
|
2303
|
+
IceRuby::ProxyInfo::optionalFormat() const
|
|
2304
|
+
{
|
|
2305
|
+
return Ice::OptionalFormatFSize;
|
|
2306
|
+
}
|
|
2307
|
+
|
|
2308
|
+
void
|
|
2309
|
+
IceRuby::ProxyInfo::marshal(VALUE p, const Ice::OutputStreamPtr& os, ObjectMap*, bool optional)
|
|
2310
|
+
{
|
|
2311
|
+
Ice::OutputStream::size_type sizePos = -1;
|
|
2312
|
+
if(optional)
|
|
2313
|
+
{
|
|
2314
|
+
sizePos = os->startSize();
|
|
2315
|
+
}
|
|
2316
|
+
|
|
2317
|
+
if(NIL_P(p))
|
|
2318
|
+
{
|
|
2319
|
+
os->write(Ice::ObjectPrx());
|
|
2320
|
+
}
|
|
2321
|
+
else
|
|
2322
|
+
{
|
|
2323
|
+
assert(checkProxy(p)); // validate() should have caught this.
|
|
2324
|
+
os->write(getProxy(p));
|
|
2325
|
+
}
|
|
2326
|
+
|
|
2327
|
+
if(optional)
|
|
2328
|
+
{
|
|
2329
|
+
os->endSize(sizePos);
|
|
2330
|
+
}
|
|
2331
|
+
}
|
|
2332
|
+
|
|
2333
|
+
void
|
|
2334
|
+
IceRuby::ProxyInfo::unmarshal(const Ice::InputStreamPtr& is, const UnmarshalCallbackPtr& cb, VALUE target,
|
|
2335
|
+
void* closure, bool optional)
|
|
2336
|
+
{
|
|
2337
|
+
if(optional)
|
|
2338
|
+
{
|
|
2339
|
+
is->skip(4);
|
|
2340
|
+
}
|
|
2341
|
+
|
|
2342
|
+
Ice::ObjectPrx proxy;
|
|
2343
|
+
is->read(proxy);
|
|
2344
|
+
|
|
2345
|
+
if(!proxy)
|
|
2346
|
+
{
|
|
2347
|
+
cb->unmarshaled(Qnil, target, closure);
|
|
2348
|
+
return;
|
|
2349
|
+
}
|
|
2350
|
+
|
|
2351
|
+
if(NIL_P(rubyClass))
|
|
2352
|
+
{
|
|
2353
|
+
throw RubyException(rb_eRuntimeError, "class %s is declared but not defined", id.c_str());
|
|
2354
|
+
}
|
|
2355
|
+
|
|
2356
|
+
volatile VALUE p = createProxy(proxy, rubyClass);
|
|
2357
|
+
cb->unmarshaled(p, target, closure);
|
|
2358
|
+
}
|
|
2359
|
+
|
|
2360
|
+
void
|
|
2361
|
+
IceRuby::ProxyInfo::print(VALUE value, IceUtilInternal::Output& out, PrintObjectHistory*)
|
|
2362
|
+
{
|
|
2363
|
+
if(!validate(value))
|
|
2364
|
+
{
|
|
2365
|
+
out << "<invalid value - expected " << getId() << ">";
|
|
2366
|
+
return;
|
|
2367
|
+
}
|
|
2368
|
+
|
|
2369
|
+
if(NIL_P(value))
|
|
2370
|
+
{
|
|
2371
|
+
out << "<nil>";
|
|
2372
|
+
}
|
|
2373
|
+
else
|
|
2374
|
+
{
|
|
2375
|
+
out << getString(value);
|
|
2376
|
+
}
|
|
2377
|
+
}
|
|
2378
|
+
|
|
2379
|
+
void
|
|
2380
|
+
IceRuby::ProxyInfo::destroy()
|
|
2381
|
+
{
|
|
2382
|
+
const_cast<ClassInfoPtr&>(classInfo) = 0;
|
|
2383
|
+
}
|
|
2384
|
+
|
|
2385
|
+
//
|
|
2386
|
+
// ObjectWriter implementation.
|
|
2387
|
+
//
|
|
2388
|
+
IceRuby::ObjectWriter::ObjectWriter(VALUE object, ObjectMap* objectMap) :
|
|
2389
|
+
_object(object), _map(objectMap)
|
|
2390
|
+
{
|
|
2391
|
+
volatile VALUE cls = CLASS_OF(object);
|
|
2392
|
+
volatile VALUE type = callRuby(rb_const_get, cls, rb_intern("ICE_TYPE"));
|
|
2393
|
+
assert(!NIL_P(type));
|
|
2394
|
+
_info = ClassInfoPtr::dynamicCast(getType(type));
|
|
2395
|
+
assert(_info);
|
|
2396
|
+
}
|
|
2397
|
+
|
|
2398
|
+
void
|
|
2399
|
+
IceRuby::ObjectWriter::ice_preMarshal()
|
|
2400
|
+
{
|
|
2401
|
+
ID id = rb_intern("ice_preMarshal");
|
|
2402
|
+
if(callRuby(rb_respond_to, _object, id))
|
|
2403
|
+
{
|
|
2404
|
+
callRuby(rb_funcall, _object, id, 0);
|
|
2405
|
+
}
|
|
2406
|
+
}
|
|
2407
|
+
|
|
2408
|
+
void
|
|
2409
|
+
IceRuby::ObjectWriter::write(const Ice::OutputStreamPtr& os) const
|
|
2410
|
+
{
|
|
2411
|
+
Ice::SlicedDataPtr slicedData;
|
|
2412
|
+
|
|
2413
|
+
if(_info->preserve)
|
|
2414
|
+
{
|
|
2415
|
+
//
|
|
2416
|
+
// Retrieve the SlicedData object that we stored as a hidden member of the Ruby object.
|
|
2417
|
+
//
|
|
2418
|
+
slicedData = SlicedDataUtil::getMember(_object, const_cast<ObjectMap*>(_map));
|
|
2419
|
+
}
|
|
2420
|
+
|
|
2421
|
+
os->startObject(slicedData);
|
|
2422
|
+
|
|
2423
|
+
if(_info->id != "::Ice::UnknownSlicedObject")
|
|
2424
|
+
{
|
|
2425
|
+
ClassInfoPtr info = _info;
|
|
2426
|
+
while(info)
|
|
2427
|
+
{
|
|
2428
|
+
os->startSlice(info->id, info->compactId, !info->base);
|
|
2429
|
+
|
|
2430
|
+
writeMembers(os, info->members);
|
|
2431
|
+
writeMembers(os, info->optionalMembers); // The optional members have already been sorted by tag.
|
|
2432
|
+
|
|
2433
|
+
os->endSlice();
|
|
2434
|
+
|
|
2435
|
+
info = info->base;
|
|
2436
|
+
}
|
|
2437
|
+
}
|
|
2438
|
+
|
|
2439
|
+
os->endObject();
|
|
2440
|
+
}
|
|
2441
|
+
|
|
2442
|
+
void
|
|
2443
|
+
IceRuby::ObjectWriter::writeMembers(const Ice::OutputStreamPtr& os, const DataMemberList& members) const
|
|
2444
|
+
{
|
|
2445
|
+
for(DataMemberList::const_iterator q = members.begin(); q != members.end(); ++q)
|
|
2446
|
+
{
|
|
2447
|
+
DataMemberPtr member = *q;
|
|
2448
|
+
|
|
2449
|
+
volatile VALUE val = callRuby(rb_ivar_get, _object, member->rubyID);
|
|
2450
|
+
|
|
2451
|
+
if(member->optional && (val == Unset || !os->writeOptional(member->tag, member->type->optionalFormat())))
|
|
2452
|
+
{
|
|
2453
|
+
continue;
|
|
2454
|
+
}
|
|
2455
|
+
|
|
2456
|
+
if(!member->type->validate(val))
|
|
2457
|
+
{
|
|
2458
|
+
throw RubyException(rb_eTypeError, "invalid value for %s member `%s'", _info->id.c_str(),
|
|
2459
|
+
member->name.c_str());
|
|
2460
|
+
}
|
|
2461
|
+
|
|
2462
|
+
member->type->marshal(val, os, _map, member->optional);
|
|
2463
|
+
}
|
|
2464
|
+
}
|
|
2465
|
+
|
|
2466
|
+
//
|
|
2467
|
+
// ObjectReader implementation.
|
|
2468
|
+
//
|
|
2469
|
+
IceRuby::ObjectReader::ObjectReader(VALUE object, const ClassInfoPtr& info) :
|
|
2470
|
+
_object(object), _info(info)
|
|
2471
|
+
{
|
|
2472
|
+
}
|
|
2473
|
+
|
|
2474
|
+
void
|
|
2475
|
+
IceRuby::ObjectReader::ice_postUnmarshal()
|
|
2476
|
+
{
|
|
2477
|
+
ID id = rb_intern("ice_postUnmarshal");
|
|
2478
|
+
if(callRuby(rb_respond_to, _object, id))
|
|
2479
|
+
{
|
|
2480
|
+
callRuby(rb_funcall, _object, id, 0);
|
|
2481
|
+
}
|
|
2482
|
+
}
|
|
2483
|
+
|
|
2484
|
+
void
|
|
2485
|
+
IceRuby::ObjectReader::read(const Ice::InputStreamPtr& is)
|
|
2486
|
+
{
|
|
2487
|
+
is->startObject();
|
|
2488
|
+
|
|
2489
|
+
const bool unknown = _info->id == "::Ice::UnknownSlicedObject";
|
|
2490
|
+
|
|
2491
|
+
//
|
|
2492
|
+
// Unmarshal the slices of a user-defined class.
|
|
2493
|
+
//
|
|
2494
|
+
if(!unknown && _info->id != Ice::Object::ice_staticId())
|
|
2495
|
+
{
|
|
2496
|
+
ClassInfoPtr info = _info;
|
|
2497
|
+
while(info)
|
|
2498
|
+
{
|
|
2499
|
+
is->startSlice();
|
|
2500
|
+
|
|
2501
|
+
DataMemberList::const_iterator p;
|
|
2502
|
+
|
|
2503
|
+
for(p = info->members.begin(); p != info->members.end(); ++p)
|
|
2504
|
+
{
|
|
2505
|
+
DataMemberPtr member = *p;
|
|
2506
|
+
member->type->unmarshal(is, member, _object, 0, false);
|
|
2507
|
+
}
|
|
2508
|
+
|
|
2509
|
+
//
|
|
2510
|
+
// The optional members have already been sorted by tag.
|
|
2511
|
+
//
|
|
2512
|
+
for(p = info->optionalMembers.begin(); p != info->optionalMembers.end(); ++p)
|
|
2513
|
+
{
|
|
2514
|
+
DataMemberPtr member = *p;
|
|
2515
|
+
if(is->readOptional(member->tag, member->type->optionalFormat()))
|
|
2516
|
+
{
|
|
2517
|
+
member->type->unmarshal(is, member, _object, 0, true);
|
|
2518
|
+
}
|
|
2519
|
+
else
|
|
2520
|
+
{
|
|
2521
|
+
callRuby(rb_ivar_set, _object, member->rubyID, Unset);
|
|
2522
|
+
}
|
|
2523
|
+
}
|
|
2524
|
+
|
|
2525
|
+
is->endSlice();
|
|
2526
|
+
|
|
2527
|
+
info = info->base;
|
|
2528
|
+
}
|
|
2529
|
+
}
|
|
2530
|
+
|
|
2531
|
+
_slicedData = is->endObject(_info->preserve);
|
|
2532
|
+
|
|
2533
|
+
if(_slicedData)
|
|
2534
|
+
{
|
|
2535
|
+
SlicedDataUtil* util = reinterpret_cast<SlicedDataUtil*>(is->closure());
|
|
2536
|
+
assert(util);
|
|
2537
|
+
util->add(this);
|
|
2538
|
+
|
|
2539
|
+
//
|
|
2540
|
+
// Define the "unknownTypeId" member for an instance of UnknownSlicedObject.
|
|
2541
|
+
//
|
|
2542
|
+
if(unknown)
|
|
2543
|
+
{
|
|
2544
|
+
assert(!_slicedData->slices.empty());
|
|
2545
|
+
|
|
2546
|
+
volatile VALUE typeId = createString(_slicedData->slices[0]->typeId);
|
|
2547
|
+
callRuby(rb_iv_set, _object, "@unknownTypeId", typeId);
|
|
2548
|
+
}
|
|
2549
|
+
}
|
|
2550
|
+
}
|
|
2551
|
+
|
|
2552
|
+
ClassInfoPtr
|
|
2553
|
+
IceRuby::ObjectReader::getInfo() const
|
|
2554
|
+
{
|
|
2555
|
+
return _info;
|
|
2556
|
+
}
|
|
2557
|
+
|
|
2558
|
+
VALUE
|
|
2559
|
+
IceRuby::ObjectReader::getObject() const
|
|
2560
|
+
{
|
|
2561
|
+
return _object;
|
|
2562
|
+
}
|
|
2563
|
+
|
|
2564
|
+
Ice::SlicedDataPtr
|
|
2565
|
+
IceRuby::ObjectReader::getSlicedData() const
|
|
2566
|
+
{
|
|
2567
|
+
return _slicedData;
|
|
2568
|
+
}
|
|
2569
|
+
|
|
2570
|
+
//
|
|
2571
|
+
// InfoMapDestroyer implementation.
|
|
2572
|
+
//
|
|
2573
|
+
IceRuby::InfoMapDestroyer::~InfoMapDestroyer()
|
|
2574
|
+
{
|
|
2575
|
+
{
|
|
2576
|
+
for(ProxyInfoMap::iterator p = _proxyInfoMap.begin(); p != _proxyInfoMap.end(); ++p)
|
|
2577
|
+
{
|
|
2578
|
+
p->second->destroy();
|
|
2579
|
+
}
|
|
2580
|
+
}
|
|
2581
|
+
{
|
|
2582
|
+
for(ClassInfoMap::iterator p = _classInfoMap.begin(); p != _classInfoMap.end(); ++p)
|
|
2583
|
+
{
|
|
2584
|
+
p->second->destroy();
|
|
2585
|
+
}
|
|
2586
|
+
}
|
|
2587
|
+
_compactIdMap.clear();
|
|
2588
|
+
_exceptionInfoMap.clear();
|
|
2589
|
+
}
|
|
2590
|
+
|
|
2591
|
+
//
|
|
2592
|
+
// ReadObjectCallback implementation.
|
|
2593
|
+
//
|
|
2594
|
+
IceRuby::ReadObjectCallback::ReadObjectCallback(const ClassInfoPtr& info, const UnmarshalCallbackPtr& cb,
|
|
2595
|
+
VALUE target, void* closure) :
|
|
2596
|
+
_info(info), _cb(cb), _target(target), _closure(closure)
|
|
2597
|
+
{
|
|
2598
|
+
}
|
|
2599
|
+
|
|
2600
|
+
void
|
|
2601
|
+
IceRuby::ReadObjectCallback::invoke(const Ice::ObjectPtr& p)
|
|
2602
|
+
{
|
|
2603
|
+
if(p)
|
|
2604
|
+
{
|
|
2605
|
+
ObjectReaderPtr reader = ObjectReaderPtr::dynamicCast(p);
|
|
2606
|
+
assert(reader);
|
|
2607
|
+
|
|
2608
|
+
//
|
|
2609
|
+
// Verify that the unmarshaled object is compatible with the formal type.
|
|
2610
|
+
//
|
|
2611
|
+
volatile VALUE obj = reader->getObject();
|
|
2612
|
+
if(!_info->validate(obj))
|
|
2613
|
+
{
|
|
2614
|
+
Ice::UnexpectedObjectException ex(__FILE__, __LINE__);
|
|
2615
|
+
ex.reason = "unmarshaled object is not an instance of " + _info->id;
|
|
2616
|
+
ex.type = reader->getInfo()->getId();
|
|
2617
|
+
ex.expectedType = _info->id;
|
|
2618
|
+
throw ex;
|
|
2619
|
+
}
|
|
2620
|
+
|
|
2621
|
+
_cb->unmarshaled(obj, _target, _closure);
|
|
2622
|
+
}
|
|
2623
|
+
else
|
|
2624
|
+
{
|
|
2625
|
+
_cb->unmarshaled(Qnil, _target, _closure);
|
|
2626
|
+
}
|
|
2627
|
+
}
|
|
2628
|
+
|
|
2629
|
+
//
|
|
2630
|
+
// ExceptionInfo implementation.
|
|
2631
|
+
//
|
|
2632
|
+
VALUE
|
|
2633
|
+
IceRuby::ExceptionInfo::unmarshal(const Ice::InputStreamPtr& is)
|
|
2634
|
+
{
|
|
2635
|
+
volatile VALUE obj = callRuby(rb_class_new_instance, 0, static_cast<VALUE*>(0), rubyClass);
|
|
2636
|
+
|
|
2637
|
+
ExceptionInfoPtr info = this;
|
|
2638
|
+
while(info)
|
|
2639
|
+
{
|
|
2640
|
+
is->startSlice();
|
|
2641
|
+
|
|
2642
|
+
DataMemberList::iterator q;
|
|
2643
|
+
|
|
2644
|
+
for(q = info->members.begin(); q != info->members.end(); ++q)
|
|
2645
|
+
{
|
|
2646
|
+
DataMemberPtr member = *q;
|
|
2647
|
+
member->type->unmarshal(is, member, obj, 0, false);
|
|
2648
|
+
}
|
|
2649
|
+
|
|
2650
|
+
//
|
|
2651
|
+
// The optional members have already been sorted by tag.
|
|
2652
|
+
//
|
|
2653
|
+
for(q = info->optionalMembers.begin(); q != info->optionalMembers.end(); ++q)
|
|
2654
|
+
{
|
|
2655
|
+
DataMemberPtr member = *q;
|
|
2656
|
+
if(is->readOptional(member->tag, member->type->optionalFormat()))
|
|
2657
|
+
{
|
|
2658
|
+
member->type->unmarshal(is, member, obj, 0, true);
|
|
2659
|
+
}
|
|
2660
|
+
else
|
|
2661
|
+
{
|
|
2662
|
+
callRuby(rb_ivar_set, obj, member->rubyID, Unset);
|
|
2663
|
+
}
|
|
2664
|
+
}
|
|
2665
|
+
|
|
2666
|
+
is->endSlice();
|
|
2667
|
+
|
|
2668
|
+
info = info->base;
|
|
2669
|
+
}
|
|
2670
|
+
|
|
2671
|
+
return obj;
|
|
2672
|
+
}
|
|
2673
|
+
|
|
2674
|
+
void
|
|
2675
|
+
IceRuby::ExceptionInfo::print(VALUE value, IceUtilInternal::Output& out)
|
|
2676
|
+
{
|
|
2677
|
+
if(callRuby(rb_obj_is_kind_of, value, rubyClass) == Qfalse)
|
|
2678
|
+
{
|
|
2679
|
+
out << "<invalid value - expected " << id << ">";
|
|
2680
|
+
return;
|
|
2681
|
+
}
|
|
2682
|
+
|
|
2683
|
+
PrintObjectHistory history;
|
|
2684
|
+
history.index = 0;
|
|
2685
|
+
|
|
2686
|
+
out << "exception " << id;
|
|
2687
|
+
out.sb();
|
|
2688
|
+
printMembers(value, out, &history);
|
|
2689
|
+
out.eb();
|
|
2690
|
+
}
|
|
2691
|
+
|
|
2692
|
+
void
|
|
2693
|
+
IceRuby::ExceptionInfo::printMembers(VALUE value, IceUtilInternal::Output& out, PrintObjectHistory* history)
|
|
2694
|
+
{
|
|
2695
|
+
if(base)
|
|
2696
|
+
{
|
|
2697
|
+
base->printMembers(value, out, history);
|
|
2698
|
+
}
|
|
2699
|
+
|
|
2700
|
+
DataMemberList::const_iterator q;
|
|
2701
|
+
|
|
2702
|
+
for(q = members.begin(); q != members.end(); ++q)
|
|
2703
|
+
{
|
|
2704
|
+
DataMemberPtr member = *q;
|
|
2705
|
+
out << nl << member->name << " = ";
|
|
2706
|
+
if(callRuby(rb_ivar_defined, value, member->rubyID) == Qfalse)
|
|
2707
|
+
{
|
|
2708
|
+
out << "<not defined>";
|
|
2709
|
+
}
|
|
2710
|
+
else
|
|
2711
|
+
{
|
|
2712
|
+
volatile VALUE val = callRuby(rb_ivar_get, value, member->rubyID);
|
|
2713
|
+
member->type->print(val, out, history);
|
|
2714
|
+
}
|
|
2715
|
+
}
|
|
2716
|
+
|
|
2717
|
+
for(q = optionalMembers.begin(); q != optionalMembers.end(); ++q)
|
|
2718
|
+
{
|
|
2719
|
+
DataMemberPtr member = *q;
|
|
2720
|
+
out << nl << member->name << " = ";
|
|
2721
|
+
if(callRuby(rb_ivar_defined, value, member->rubyID) == Qfalse)
|
|
2722
|
+
{
|
|
2723
|
+
out << "<not defined>";
|
|
2724
|
+
}
|
|
2725
|
+
else
|
|
2726
|
+
{
|
|
2727
|
+
volatile VALUE val = callRuby(rb_ivar_get, value, member->rubyID);
|
|
2728
|
+
if(val == Unset)
|
|
2729
|
+
{
|
|
2730
|
+
out << "<unset>";
|
|
2731
|
+
}
|
|
2732
|
+
else
|
|
2733
|
+
{
|
|
2734
|
+
member->type->print(val, out, history);
|
|
2735
|
+
}
|
|
2736
|
+
}
|
|
2737
|
+
}
|
|
2738
|
+
}
|
|
2739
|
+
|
|
2740
|
+
//
|
|
2741
|
+
// ExceptionReader implementation.
|
|
2742
|
+
//
|
|
2743
|
+
IceRuby::ExceptionReader::ExceptionReader(const Ice::CommunicatorPtr& communicator, const ExceptionInfoPtr& info) :
|
|
2744
|
+
Ice::UserExceptionReader(communicator), _info(info)
|
|
2745
|
+
{
|
|
2746
|
+
}
|
|
2747
|
+
|
|
2748
|
+
IceRuby::ExceptionReader::~ExceptionReader()
|
|
2749
|
+
throw()
|
|
2750
|
+
{
|
|
2751
|
+
}
|
|
2752
|
+
|
|
2753
|
+
void
|
|
2754
|
+
IceRuby::ExceptionReader::read(const Ice::InputStreamPtr& is) const
|
|
2755
|
+
{
|
|
2756
|
+
is->startException();
|
|
2757
|
+
|
|
2758
|
+
const_cast<VALUE&>(_ex) = _info->unmarshal(is);
|
|
2759
|
+
|
|
2760
|
+
const_cast<Ice::SlicedDataPtr&>(_slicedData) = is->endException(_info->preserve);
|
|
2761
|
+
}
|
|
2762
|
+
|
|
2763
|
+
bool
|
|
2764
|
+
IceRuby::ExceptionReader::usesClasses() const
|
|
2765
|
+
{
|
|
2766
|
+
return _info->usesClasses;
|
|
2767
|
+
}
|
|
2768
|
+
|
|
2769
|
+
string
|
|
2770
|
+
IceRuby::ExceptionReader::ice_name() const
|
|
2771
|
+
{
|
|
2772
|
+
return _info->id;
|
|
2773
|
+
}
|
|
2774
|
+
|
|
2775
|
+
Ice::UserException*
|
|
2776
|
+
IceRuby::ExceptionReader::ice_clone() const
|
|
2777
|
+
{
|
|
2778
|
+
assert(false);
|
|
2779
|
+
return 0;
|
|
2780
|
+
}
|
|
2781
|
+
|
|
2782
|
+
void
|
|
2783
|
+
IceRuby::ExceptionReader::ice_throw() const
|
|
2784
|
+
{
|
|
2785
|
+
throw *this;
|
|
2786
|
+
}
|
|
2787
|
+
|
|
2788
|
+
VALUE
|
|
2789
|
+
IceRuby::ExceptionReader::getException() const
|
|
2790
|
+
{
|
|
2791
|
+
return _ex;
|
|
2792
|
+
}
|
|
2793
|
+
|
|
2794
|
+
Ice::SlicedDataPtr
|
|
2795
|
+
IceRuby::ExceptionReader::getSlicedData() const
|
|
2796
|
+
{
|
|
2797
|
+
return _slicedData;
|
|
2798
|
+
}
|
|
2799
|
+
|
|
2800
|
+
//
|
|
2801
|
+
// IdResolver
|
|
2802
|
+
//
|
|
2803
|
+
string
|
|
2804
|
+
IceRuby::IdResolver::resolve(Ice::Int id) const
|
|
2805
|
+
{
|
|
2806
|
+
CompactIdMap::iterator p = _compactIdMap.find(id);
|
|
2807
|
+
if(p != _compactIdMap.end())
|
|
2808
|
+
{
|
|
2809
|
+
return p->second->id;
|
|
2810
|
+
}
|
|
2811
|
+
return string();
|
|
2812
|
+
}
|
|
2813
|
+
|
|
2814
|
+
extern "C"
|
|
2815
|
+
VALUE
|
|
2816
|
+
IceRuby_defineEnum(VALUE /*self*/, VALUE id, VALUE type, VALUE enumerators)
|
|
2817
|
+
{
|
|
2818
|
+
ICE_RUBY_TRY
|
|
2819
|
+
{
|
|
2820
|
+
EnumInfoPtr info = new EnumInfo(id, type, enumerators);
|
|
2821
|
+
return createType(info);
|
|
2822
|
+
}
|
|
2823
|
+
ICE_RUBY_CATCH
|
|
2824
|
+
return Qnil;
|
|
2825
|
+
}
|
|
2826
|
+
|
|
2827
|
+
extern "C"
|
|
2828
|
+
VALUE
|
|
2829
|
+
IceRuby_defineStruct(VALUE /*self*/, VALUE id, VALUE type, VALUE members)
|
|
2830
|
+
{
|
|
2831
|
+
ICE_RUBY_TRY
|
|
2832
|
+
{
|
|
2833
|
+
StructInfoPtr info = new StructInfo(id, type, members);
|
|
2834
|
+
return createType(info);
|
|
2835
|
+
}
|
|
2836
|
+
ICE_RUBY_CATCH
|
|
2837
|
+
return Qnil;
|
|
2838
|
+
}
|
|
2839
|
+
|
|
2840
|
+
extern "C"
|
|
2841
|
+
VALUE
|
|
2842
|
+
IceRuby_defineSequence(VALUE /*self*/, VALUE id, VALUE elementType)
|
|
2843
|
+
{
|
|
2844
|
+
ICE_RUBY_TRY
|
|
2845
|
+
{
|
|
2846
|
+
SequenceInfoPtr info = new SequenceInfo(id, elementType);
|
|
2847
|
+
return createType(info);
|
|
2848
|
+
}
|
|
2849
|
+
ICE_RUBY_CATCH
|
|
2850
|
+
return Qnil;
|
|
2851
|
+
}
|
|
2852
|
+
|
|
2853
|
+
extern "C"
|
|
2854
|
+
VALUE
|
|
2855
|
+
IceRuby_defineDictionary(VALUE /*self*/, VALUE id, VALUE keyType, VALUE valueType)
|
|
2856
|
+
{
|
|
2857
|
+
ICE_RUBY_TRY
|
|
2858
|
+
{
|
|
2859
|
+
DictionaryInfoPtr info = new DictionaryInfo(id, keyType, valueType);
|
|
2860
|
+
return createType(info);
|
|
2861
|
+
}
|
|
2862
|
+
ICE_RUBY_CATCH
|
|
2863
|
+
return Qnil;
|
|
2864
|
+
}
|
|
2865
|
+
|
|
2866
|
+
extern "C"
|
|
2867
|
+
VALUE
|
|
2868
|
+
IceRuby_declareProxy(VALUE /*self*/, VALUE id)
|
|
2869
|
+
{
|
|
2870
|
+
ICE_RUBY_TRY
|
|
2871
|
+
{
|
|
2872
|
+
string proxyId = getString(id);
|
|
2873
|
+
proxyId += "Prx";
|
|
2874
|
+
|
|
2875
|
+
ProxyInfoPtr info = lookupProxyInfo(proxyId);
|
|
2876
|
+
if(!info)
|
|
2877
|
+
{
|
|
2878
|
+
info = new ProxyInfo(id);
|
|
2879
|
+
addProxyInfo(proxyId, info);
|
|
2880
|
+
}
|
|
2881
|
+
|
|
2882
|
+
return info->typeObj;
|
|
2883
|
+
}
|
|
2884
|
+
ICE_RUBY_CATCH
|
|
2885
|
+
return Qnil;
|
|
2886
|
+
}
|
|
2887
|
+
|
|
2888
|
+
extern "C"
|
|
2889
|
+
VALUE
|
|
2890
|
+
IceRuby_declareClass(VALUE /*self*/, VALUE id)
|
|
2891
|
+
{
|
|
2892
|
+
ICE_RUBY_TRY
|
|
2893
|
+
{
|
|
2894
|
+
string idstr = getString(id);
|
|
2895
|
+
ClassInfoPtr info = lookupClassInfo(idstr);
|
|
2896
|
+
if(!info)
|
|
2897
|
+
{
|
|
2898
|
+
info = new ClassInfo(id, false);
|
|
2899
|
+
addClassInfo(idstr, info);
|
|
2900
|
+
}
|
|
2901
|
+
|
|
2902
|
+
return info->typeObj;
|
|
2903
|
+
}
|
|
2904
|
+
ICE_RUBY_CATCH
|
|
2905
|
+
return Qnil;
|
|
2906
|
+
}
|
|
2907
|
+
|
|
2908
|
+
extern "C"
|
|
2909
|
+
VALUE
|
|
2910
|
+
IceRuby_declareLocalClass(VALUE /*self*/, VALUE id)
|
|
2911
|
+
{
|
|
2912
|
+
ICE_RUBY_TRY
|
|
2913
|
+
{
|
|
2914
|
+
string idstr = getString(id);
|
|
2915
|
+
ClassInfoPtr info = lookupClassInfo(idstr);
|
|
2916
|
+
if(!info)
|
|
2917
|
+
{
|
|
2918
|
+
info = new ClassInfo(id, true);
|
|
2919
|
+
addClassInfo(idstr, info);
|
|
2920
|
+
}
|
|
2921
|
+
|
|
2922
|
+
return info->typeObj;
|
|
2923
|
+
}
|
|
2924
|
+
ICE_RUBY_CATCH
|
|
2925
|
+
return Qnil;
|
|
2926
|
+
}
|
|
2927
|
+
|
|
2928
|
+
extern "C"
|
|
2929
|
+
VALUE
|
|
2930
|
+
IceRuby_defineException(VALUE /*self*/, VALUE id, VALUE type, VALUE preserve, VALUE base, VALUE members)
|
|
2931
|
+
{
|
|
2932
|
+
ICE_RUBY_TRY
|
|
2933
|
+
{
|
|
2934
|
+
ExceptionInfoPtr info = new ExceptionInfo;
|
|
2935
|
+
info->id = getString(id);
|
|
2936
|
+
|
|
2937
|
+
info->preserve = preserve == Qtrue;
|
|
2938
|
+
|
|
2939
|
+
if(!NIL_P(base))
|
|
2940
|
+
{
|
|
2941
|
+
info->base = ExceptionInfoPtr::dynamicCast(getException(base));
|
|
2942
|
+
assert(info->base);
|
|
2943
|
+
}
|
|
2944
|
+
|
|
2945
|
+
convertDataMembers(members, info->members, info->optionalMembers, true);
|
|
2946
|
+
|
|
2947
|
+
info->usesClasses = false;
|
|
2948
|
+
|
|
2949
|
+
//
|
|
2950
|
+
// Only examine the required members to see if any use classes.
|
|
2951
|
+
//
|
|
2952
|
+
for(DataMemberList::iterator p = info->members.begin(); p != info->members.end(); ++p)
|
|
2953
|
+
{
|
|
2954
|
+
if(!info->usesClasses)
|
|
2955
|
+
{
|
|
2956
|
+
info->usesClasses = (*p)->type->usesClasses();
|
|
2957
|
+
}
|
|
2958
|
+
}
|
|
2959
|
+
|
|
2960
|
+
info->rubyClass = type;
|
|
2961
|
+
|
|
2962
|
+
addExceptionInfo(info->id, info);
|
|
2963
|
+
|
|
2964
|
+
return createException(info);
|
|
2965
|
+
}
|
|
2966
|
+
ICE_RUBY_CATCH
|
|
2967
|
+
return Qnil;
|
|
2968
|
+
}
|
|
2969
|
+
|
|
2970
|
+
extern "C"
|
|
2971
|
+
VALUE
|
|
2972
|
+
IceRuby_TypeInfo_defineProxy(VALUE self, VALUE type, VALUE classInfo)
|
|
2973
|
+
{
|
|
2974
|
+
ICE_RUBY_TRY
|
|
2975
|
+
{
|
|
2976
|
+
ProxyInfoPtr info = ProxyInfoPtr::dynamicCast(getType(self));
|
|
2977
|
+
assert(info);
|
|
2978
|
+
|
|
2979
|
+
info->define(type, classInfo);
|
|
2980
|
+
}
|
|
2981
|
+
ICE_RUBY_CATCH
|
|
2982
|
+
return Qnil;
|
|
2983
|
+
}
|
|
2984
|
+
|
|
2985
|
+
extern "C"
|
|
2986
|
+
VALUE
|
|
2987
|
+
IceRuby_TypeInfo_defineClass(VALUE self, VALUE type, VALUE compactId, VALUE isAbstract, VALUE preserve, VALUE base,
|
|
2988
|
+
VALUE interfaces, VALUE members)
|
|
2989
|
+
{
|
|
2990
|
+
ICE_RUBY_TRY
|
|
2991
|
+
{
|
|
2992
|
+
ClassInfoPtr info = ClassInfoPtr::dynamicCast(getType(self));
|
|
2993
|
+
assert(info);
|
|
2994
|
+
|
|
2995
|
+
info->define(type, compactId, isAbstract, preserve, base, interfaces, members);
|
|
2996
|
+
|
|
2997
|
+
CompactIdMap::iterator q = _compactIdMap.find(info->compactId);
|
|
2998
|
+
if(q != _compactIdMap.end())
|
|
2999
|
+
{
|
|
3000
|
+
_compactIdMap.erase(q);
|
|
3001
|
+
}
|
|
3002
|
+
_compactIdMap.insert(CompactIdMap::value_type(info->compactId, info));
|
|
3003
|
+
}
|
|
3004
|
+
ICE_RUBY_CATCH
|
|
3005
|
+
return Qnil;
|
|
3006
|
+
}
|
|
3007
|
+
|
|
3008
|
+
extern "C"
|
|
3009
|
+
VALUE
|
|
3010
|
+
IceRuby_stringify(VALUE /*self*/, VALUE obj, VALUE type)
|
|
3011
|
+
{
|
|
3012
|
+
ICE_RUBY_TRY
|
|
3013
|
+
{
|
|
3014
|
+
TypeInfoPtr info = getType(type);
|
|
3015
|
+
|
|
3016
|
+
ostringstream ostr;
|
|
3017
|
+
IceUtilInternal::Output out(ostr);
|
|
3018
|
+
PrintObjectHistory history;
|
|
3019
|
+
history.index = 0;
|
|
3020
|
+
info->print(obj, out, &history);
|
|
3021
|
+
|
|
3022
|
+
string str = ostr.str();
|
|
3023
|
+
return createString(str);
|
|
3024
|
+
}
|
|
3025
|
+
ICE_RUBY_CATCH
|
|
3026
|
+
return Qnil;
|
|
3027
|
+
}
|
|
3028
|
+
|
|
3029
|
+
extern "C"
|
|
3030
|
+
VALUE
|
|
3031
|
+
IceRuby_stringifyException(VALUE /*self*/, VALUE ex)
|
|
3032
|
+
{
|
|
3033
|
+
ICE_RUBY_TRY
|
|
3034
|
+
{
|
|
3035
|
+
volatile VALUE cls = CLASS_OF(ex);
|
|
3036
|
+
volatile VALUE type = callRuby(rb_const_get, cls, rb_intern("ICE_TYPE"));
|
|
3037
|
+
ExceptionInfoPtr info = getException(type);
|
|
3038
|
+
|
|
3039
|
+
ostringstream ostr;
|
|
3040
|
+
IceUtilInternal::Output out(ostr);
|
|
3041
|
+
info->print(ex, out);
|
|
3042
|
+
|
|
3043
|
+
string str = ostr.str();
|
|
3044
|
+
return createString(str);
|
|
3045
|
+
}
|
|
3046
|
+
ICE_RUBY_CATCH
|
|
3047
|
+
return Qnil;
|
|
3048
|
+
}
|
|
3049
|
+
|
|
3050
|
+
//
|
|
3051
|
+
// lookupClassInfo()
|
|
3052
|
+
//
|
|
3053
|
+
IceRuby::ClassInfoPtr
|
|
3054
|
+
IceRuby::lookupClassInfo(const string& id)
|
|
3055
|
+
{
|
|
3056
|
+
ClassInfoMap::iterator p = _classInfoMap.find(id);
|
|
3057
|
+
if(p != _classInfoMap.end())
|
|
3058
|
+
{
|
|
3059
|
+
return p->second;
|
|
3060
|
+
}
|
|
3061
|
+
return 0;
|
|
3062
|
+
}
|
|
3063
|
+
|
|
3064
|
+
//
|
|
3065
|
+
// lookupExceptionInfo()
|
|
3066
|
+
//
|
|
3067
|
+
IceRuby::ExceptionInfoPtr
|
|
3068
|
+
IceRuby::lookupExceptionInfo(const string& id)
|
|
3069
|
+
{
|
|
3070
|
+
ExceptionInfoMap::iterator p = _exceptionInfoMap.find(id);
|
|
3071
|
+
if(p != _exceptionInfoMap.end())
|
|
3072
|
+
{
|
|
3073
|
+
return p->second;
|
|
3074
|
+
}
|
|
3075
|
+
return 0;
|
|
3076
|
+
}
|
|
3077
|
+
|
|
3078
|
+
bool
|
|
3079
|
+
IceRuby::initTypes(VALUE iceModule)
|
|
3080
|
+
{
|
|
3081
|
+
//
|
|
3082
|
+
// Define a class to represent TypeInfo, and another to represent ExceptionInfo.
|
|
3083
|
+
//
|
|
3084
|
+
_typeInfoClass = rb_define_class_under(iceModule, "Internal_TypeInfo", rb_cObject);
|
|
3085
|
+
_exceptionInfoClass = rb_define_class_under(iceModule, "Internal_ExceptionInfo", rb_cObject);
|
|
3086
|
+
|
|
3087
|
+
rb_define_const(iceModule, "T_bool", createType(new PrimitiveInfo(PrimitiveInfo::KindBool)));
|
|
3088
|
+
rb_define_const(iceModule, "T_byte", createType(new PrimitiveInfo(PrimitiveInfo::KindByte)));
|
|
3089
|
+
rb_define_const(iceModule, "T_short", createType(new PrimitiveInfo(PrimitiveInfo::KindShort)));
|
|
3090
|
+
rb_define_const(iceModule, "T_int", createType(new PrimitiveInfo(PrimitiveInfo::KindInt)));
|
|
3091
|
+
rb_define_const(iceModule, "T_long", createType(new PrimitiveInfo(PrimitiveInfo::KindLong)));
|
|
3092
|
+
rb_define_const(iceModule, "T_float", createType(new PrimitiveInfo(PrimitiveInfo::KindFloat)));
|
|
3093
|
+
rb_define_const(iceModule, "T_double", createType(new PrimitiveInfo(PrimitiveInfo::KindDouble)));
|
|
3094
|
+
rb_define_const(iceModule, "T_string", createType(new PrimitiveInfo(PrimitiveInfo::KindString)));
|
|
3095
|
+
|
|
3096
|
+
rb_define_module_function(iceModule, "__defineEnum", CAST_METHOD(IceRuby_defineEnum), 3);
|
|
3097
|
+
rb_define_module_function(iceModule, "__defineStruct", CAST_METHOD(IceRuby_defineStruct), 3);
|
|
3098
|
+
rb_define_module_function(iceModule, "__defineSequence", CAST_METHOD(IceRuby_defineSequence), 2);
|
|
3099
|
+
rb_define_module_function(iceModule, "__defineDictionary", CAST_METHOD(IceRuby_defineDictionary), 3);
|
|
3100
|
+
rb_define_module_function(iceModule, "__declareProxy", CAST_METHOD(IceRuby_declareProxy), 1);
|
|
3101
|
+
rb_define_module_function(iceModule, "__declareClass", CAST_METHOD(IceRuby_declareClass), 1);
|
|
3102
|
+
rb_define_module_function(iceModule, "__declareLocalClass", CAST_METHOD(IceRuby_declareLocalClass), 1);
|
|
3103
|
+
rb_define_module_function(iceModule, "__defineException", CAST_METHOD(IceRuby_defineException), 5);
|
|
3104
|
+
|
|
3105
|
+
rb_define_method(_typeInfoClass, "defineClass", CAST_METHOD(IceRuby_TypeInfo_defineClass), 7);
|
|
3106
|
+
rb_define_method(_typeInfoClass, "defineProxy", CAST_METHOD(IceRuby_TypeInfo_defineProxy), 2);
|
|
3107
|
+
|
|
3108
|
+
rb_define_module_function(iceModule, "__stringify", CAST_METHOD(IceRuby_stringify), 2);
|
|
3109
|
+
rb_define_module_function(iceModule, "__stringifyException", CAST_METHOD(IceRuby_stringifyException), 1);
|
|
3110
|
+
|
|
3111
|
+
_unsetTypeClass = rb_define_class_under(iceModule, "Internal_UnsetType", rb_cObject);
|
|
3112
|
+
Unset = callRuby(rb_class_new_instance, 0, static_cast<VALUE*>(0), _unsetTypeClass);
|
|
3113
|
+
rb_define_const(iceModule, "Unset", Unset);
|
|
3114
|
+
|
|
3115
|
+
return true;
|
|
3116
|
+
}
|
|
3117
|
+
|
|
3118
|
+
IceRuby::TypeInfoPtr
|
|
3119
|
+
IceRuby::getType(VALUE obj)
|
|
3120
|
+
{
|
|
3121
|
+
assert(TYPE(obj) == T_DATA);
|
|
3122
|
+
assert(rb_obj_is_instance_of(obj, _typeInfoClass) == Qtrue);
|
|
3123
|
+
TypeInfoPtr* p = reinterpret_cast<TypeInfoPtr*>(DATA_PTR(obj));
|
|
3124
|
+
return *p;
|
|
3125
|
+
}
|
|
3126
|
+
|
|
3127
|
+
extern "C"
|
|
3128
|
+
void
|
|
3129
|
+
IceRuby_TypeInfo_free(TypeInfoPtr* p)
|
|
3130
|
+
{
|
|
3131
|
+
delete p;
|
|
3132
|
+
}
|
|
3133
|
+
|
|
3134
|
+
VALUE
|
|
3135
|
+
IceRuby::createType(const TypeInfoPtr& info)
|
|
3136
|
+
{
|
|
3137
|
+
return Data_Wrap_Struct(_typeInfoClass, 0, IceRuby_TypeInfo_free, new TypeInfoPtr(info));
|
|
3138
|
+
}
|
|
3139
|
+
|
|
3140
|
+
IceRuby::ExceptionInfoPtr
|
|
3141
|
+
IceRuby::getException(VALUE obj)
|
|
3142
|
+
{
|
|
3143
|
+
assert(TYPE(obj) == T_DATA);
|
|
3144
|
+
assert(rb_obj_is_instance_of(obj, _exceptionInfoClass) == Qtrue);
|
|
3145
|
+
ExceptionInfoPtr* p = reinterpret_cast<ExceptionInfoPtr*>(DATA_PTR(obj));
|
|
3146
|
+
return *p;
|
|
3147
|
+
}
|
|
3148
|
+
|
|
3149
|
+
extern "C"
|
|
3150
|
+
void
|
|
3151
|
+
IceRuby_ExceptionInfo_free(ExceptionInfoPtr* p)
|
|
3152
|
+
{
|
|
3153
|
+
delete p;
|
|
3154
|
+
}
|
|
3155
|
+
|
|
3156
|
+
VALUE
|
|
3157
|
+
IceRuby::createException(const ExceptionInfoPtr& info)
|
|
3158
|
+
{
|
|
3159
|
+
return Data_Wrap_Struct(_exceptionInfoClass, 0, IceRuby_ExceptionInfo_free, new ExceptionInfoPtr(info));
|
|
3160
|
+
}
|