summaryrefslogtreecommitdiff
path: root/php/src
diff options
context:
space:
mode:
Diffstat (limited to 'php/src')
-rw-r--r--php/src/IcePHP/Operation.cpp35
-rw-r--r--php/src/IcePHP/Types.cpp57
-rw-r--r--php/src/IcePHP/Types.h12
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;