diff options
author | Mark Spruiell <mes@zeroc.com> | 2012-11-09 16:22:47 -0800 |
---|---|---|
committer | Mark Spruiell <mes@zeroc.com> | 2012-11-09 16:22:47 -0800 |
commit | 493caea19fd83663eb03b4eeaf7714f99ac07b97 (patch) | |
tree | 39f8b7dc983394288cb25961a0907ebe0b0f5847 /php/src | |
parent | ICE-4914 - Update Database/Oracle demos (diff) | |
download | ice-493caea19fd83663eb03b4eeaf7714f99ac07b97.tar.bz2 ice-493caea19fd83663eb03b4eeaf7714f99ac07b97.tar.xz ice-493caea19fd83663eb03b4eeaf7714f99ac07b97.zip |
ICE-4930 - fixes for scripting languages
Diffstat (limited to 'php/src')
-rw-r--r-- | php/src/IcePHP/Operation.cpp | 35 | ||||
-rw-r--r-- | php/src/IcePHP/Types.cpp | 57 | ||||
-rw-r--r-- | php/src/IcePHP/Types.h | 12 |
3 files changed, 98 insertions, 6 deletions
diff --git a/php/src/IcePHP/Operation.cpp b/php/src/IcePHP/Operation.cpp index 82e5bc7a6d8..4dee27a4ae2 100644 --- a/php/src/IcePHP/Operation.cpp +++ b/php/src/IcePHP/Operation.cpp @@ -80,13 +80,15 @@ public: ParamInfoList optionalOutParams; ParamInfoPtr returnType; ExceptionInfoList exceptions; + bool sendsClasses; + bool returnsClasses; int numParams; private: zend_internal_function* _zendFunction; - static void convertParams(zval*, ParamInfoList& TSRMLS_DC); + static void convertParams(zval*, ParamInfoList&, bool& TSRMLS_DC); static ParamInfoPtr convertParam(zval*, int TSRMLS_DC); static void getArgInfo(zend_arg_info&, const ParamInfoPtr&, bool); }; @@ -220,17 +222,19 @@ IcePHP::OperationI::OperationI(const char* n, Ice::OperationMode m, Ice::Operati // // inParams // + sendsClasses = false; if(in) { - convertParams(in, inParams TSRMLS_CC); + convertParams(in, inParams, sendsClasses TSRMLS_CC); } // // outParams // + returnsClasses = false; if(out) { - convertParams(out, outParams TSRMLS_CC); + convertParams(out, outParams, returnsClasses TSRMLS_CC); } // @@ -239,6 +243,10 @@ IcePHP::OperationI::OperationI(const char* n, Ice::OperationMode m, Ice::Operati if(ret) { returnType = convertParam(ret, 0 TSRMLS_CC); + if(!returnsClasses) + { + returnsClasses = returnType->type->usesClasses(); + } } numParams = static_cast<int>(inParams.size() + outParams.size()); @@ -355,7 +363,7 @@ IcePHP::OperationI::function() } void -IcePHP::OperationI::convertParams(zval* p, ParamInfoList& params TSRMLS_DC) +IcePHP::OperationI::convertParams(zval* p, ParamInfoList& params, bool& usesClasses TSRMLS_DC) { assert(Z_TYPE_P(p) == IS_ARRAY); HashTable* arr = Z_ARRVAL_P(p); @@ -366,7 +374,12 @@ IcePHP::OperationI::convertParams(zval* p, ParamInfoList& params TSRMLS_DC) while(zend_hash_get_current_data_ex(arr, &data, &pos) != FAILURE) { zval** val = reinterpret_cast<zval**>(data); - params.push_back(convertParam(*val, i TSRMLS_CC)); + ParamInfoPtr param = convertParam(*val, i TSRMLS_CC); + params.push_back(param); + if(!param->optional && !usesClasses) + { + usesClasses = param->type->usesClasses(); + } zend_hash_move_forward_ex(arr, &pos); ++i; } @@ -521,6 +534,11 @@ IcePHP::TypedInvocation::prepareRequest(int argc, zval** args, Ice::ByteSeq& byt } } + if(_op->sendsClasses) + { + os->writePendingObjects(); + } + os->endEncapsulation(); os->finished(bytes); } @@ -596,7 +614,7 @@ IcePHP::TypedInvocation::unmarshalResults(int argc, zval** args, zval* ret, ParamInfoPtr info = *p; ResultCallbackPtr cb = new ResultCallback; - if(info->tag == _op->returnType->tag) + if(_op->returnType && info->tag == _op->returnType->tag) { retCallback = cb; } @@ -615,6 +633,11 @@ IcePHP::TypedInvocation::unmarshalResults(int argc, zval** args, zval* ret, } } + if(_op->returnsClasses) + { + is->readPendingObjects(); + } + is->endEncapsulation(); util.update(TSRMLS_C); diff --git a/php/src/IcePHP/Types.cpp b/php/src/IcePHP/Types.cpp index 323bd1d3e90..976073c3217 100644 --- a/php/src/IcePHP/Types.cpp +++ b/php/src/IcePHP/Types.cpp @@ -583,6 +583,12 @@ IcePHP::TypeInfo::TypeInfo() { } +bool +IcePHP::TypeInfo::usesClasses() const +{ + return false; +} + void IcePHP::TypeInfo::unmarshaled(zval*, zval*, void* TSRMLS_DC) { @@ -1305,6 +1311,20 @@ IcePHP::StructInfo::optionalFormat() const return _variableLength ? Ice::OptionalFormatFSize : Ice::OptionalFormatVSize; } +bool +IcePHP::StructInfo::usesClasses() const +{ + for(DataMemberList::const_iterator p = members.begin(); p != members.end(); ++p) + { + if((*p)->type->usesClasses()) + { + return true; + } + } + + return false; +} + void IcePHP::StructInfo::marshal(zval* zv, const Ice::OutputStreamPtr& os, ObjectMap* objectMap, bool optional TSRMLS_DC) { @@ -1462,6 +1482,12 @@ IcePHP::SequenceInfo::optionalFormat() const return elementType->variableLength() ? Ice::OptionalFormatFSize : Ice::OptionalFormatVSize; } +bool +IcePHP::SequenceInfo::usesClasses() const +{ + return elementType->usesClasses(); +} + void IcePHP::SequenceInfo::marshal(zval* zv, const Ice::OutputStreamPtr& os, ObjectMap* objectMap, bool optional TSRMLS_DC) { @@ -2015,6 +2041,12 @@ IcePHP::DictionaryInfo::optionalFormat() const return _variableLength ? Ice::OptionalFormatFSize : Ice::OptionalFormatVSize; } +bool +IcePHP::DictionaryInfo::usesClasses() const +{ + return valueType->usesClasses(); +} + void IcePHP::DictionaryInfo::marshal(zval* zv, const Ice::OutputStreamPtr& os, ObjectMap* objectMap, bool optional TSRMLS_DC) { @@ -2436,6 +2468,12 @@ IcePHP::ClassInfo::optionalFormat() const return Ice::OptionalFormatSize; } +bool +IcePHP::ClassInfo::usesClasses() const +{ + return true; +} + void IcePHP::ClassInfo::marshal(zval* zv, const Ice::OutputStreamPtr& os, ObjectMap* objectMap, bool TSRMLS_DC) { @@ -3284,6 +3322,12 @@ IcePHP::ExceptionReader::read(const Ice::InputStreamPtr& is) const const_cast<Ice::SlicedDataPtr&>(_slicedData) = is->endException(_info->preserve); } +bool +IcePHP::ExceptionReader::usesClasses() const +{ + return _info->usesClasses; +} + string IcePHP::ExceptionReader::ice_name() const { @@ -3633,6 +3677,19 @@ ZEND_FUNCTION(IcePHP_defineException) convertDataMembers(members, ex->members, ex->optionalMembers, true TSRMLS_CC); } + ex->usesClasses = false; + + // + // Only examine the required members to see if any use classes. + // + for(DataMemberList::iterator p = ex->members.begin(); p != ex->members.end(); ++p) + { + if(!ex->usesClasses) + { + ex->usesClasses = (*p)->type->usesClasses(); + } + } + ex->zce = nameToClass(ex->name TSRMLS_CC); assert(!getExceptionInfo(ex->id TSRMLS_CC)); diff --git a/php/src/IcePHP/Types.h b/php/src/IcePHP/Types.h index d3d4825e3eb..f682d0f3cf4 100644 --- a/php/src/IcePHP/Types.h +++ b/php/src/IcePHP/Types.h @@ -117,6 +117,8 @@ public: virtual int wireSize() const = 0; virtual Ice::OptionalFormat optionalFormat() const = 0; + virtual bool usesClasses() const; // Default implementation returns false. + virtual void unmarshaled(zval*, zval*, void* TSRMLS_DC); // Default implementation is assert(false). virtual void destroy(); @@ -239,6 +241,8 @@ public: virtual int wireSize() const; virtual Ice::OptionalFormat optionalFormat() const; + virtual bool usesClasses() const; + virtual void marshal(zval*, const Ice::OutputStreamPtr&, ObjectMap*, bool TSRMLS_DC); virtual void unmarshal(const Ice::InputStreamPtr&, const UnmarshalCallbackPtr&, const CommunicatorInfoPtr&, zval*, void*, bool TSRMLS_DC); @@ -276,6 +280,8 @@ public: virtual int wireSize() const; virtual Ice::OptionalFormat optionalFormat() const; + virtual bool usesClasses() const; + virtual void marshal(zval*, const Ice::OutputStreamPtr&, ObjectMap*, bool TSRMLS_DC); virtual void unmarshal(const Ice::InputStreamPtr&, const UnmarshalCallbackPtr&, const CommunicatorInfoPtr&, zval*, void*, bool TSRMLS_DC); @@ -314,6 +320,8 @@ public: virtual int wireSize() const; virtual Ice::OptionalFormat optionalFormat() const; + virtual bool usesClasses() const; + virtual void marshal(zval*, const Ice::OutputStreamPtr&, ObjectMap*, bool TSRMLS_DC); virtual void unmarshal(const Ice::InputStreamPtr&, const UnmarshalCallbackPtr&, const CommunicatorInfoPtr&, zval*, void*, bool TSRMLS_DC); @@ -385,6 +393,8 @@ public: virtual int wireSize() const; virtual Ice::OptionalFormat optionalFormat() const; + virtual bool usesClasses() const; + virtual void marshal(zval*, const Ice::OutputStreamPtr&, ObjectMap*, bool TSRMLS_DC); virtual void unmarshal(const Ice::InputStreamPtr&, const UnmarshalCallbackPtr&, const CommunicatorInfoPtr&, zval*, void*, bool TSRMLS_DC); @@ -468,6 +478,7 @@ public: ExceptionInfoPtr base; DataMemberList members; DataMemberList optionalMembers; + bool usesClasses; zend_class_entry* zce; }; @@ -550,6 +561,7 @@ public: ~ExceptionReader() throw(); virtual void read(const Ice::InputStreamPtr&) const; + virtual bool usesClasses() const; virtual std::string ice_name() const; virtual ExceptionReader* ice_clone() const; |