summaryrefslogtreecommitdiff
path: root/php/src
diff options
context:
space:
mode:
authorMark Spruiell <mes@zeroc.com>2017-03-29 15:44:15 -0700
committerMark Spruiell <mes@zeroc.com>2017-03-29 15:44:15 -0700
commita173aa6fe157e150c283fc88e8d33f3aa91a988c (patch)
tree9d7887cd9b025beb962486165d6b8b1ef200cd29 /php/src
parentICE-7716 - more scripting language fixes (diff)
downloadice-a173aa6fe157e150c283fc88e8d33f3aa91a988c.tar.bz2
ice-a173aa6fe157e150c283fc88e8d33f3aa91a988c.tar.xz
ice-a173aa6fe157e150c283fc88e8d33f3aa91a988c.zip
ICE-7716 - PHP5 fixes
Diffstat (limited to 'php/src')
-rw-r--r--php/src/php5/Communicator.cpp76
1 files changed, 49 insertions, 27 deletions
diff --git a/php/src/php5/Communicator.cpp b/php/src/php5/Communicator.cpp
index a541b426ebe..77c33a50506 100644
--- a/php/src/php5/Communicator.cpp
+++ b/php/src/php5/Communicator.cpp
@@ -1100,52 +1100,74 @@ ZEND_FUNCTION(Ice_initialize)
zval* zvinit = 0;
//
- // Accept the following invocations:
+ // The argument options are:
//
- // initialize(array, InitializationData)
- // initialize(array)
- // initialize(InitializationData)
// initialize()
+ // initialize(args)
+ // initialize(initData)
+ // initialize(args, initData)
+ // initialize(initData, args)
//
- bool hasArgs = false;
- if(ZEND_NUM_ARGS())
+
+ if(ZEND_NUM_ARGS() > 2)
+ {
+ runtimeError("too many arguments to initialize" TSRMLS_CC);
+ RETURN_NULL();
+ }
+
+ if(ZEND_NUM_ARGS() > 0)
+ {
+ zval* arg = *args[0];
+
+ if(Z_TYPE_P(arg) == IS_ARRAY)
+ {
+ zvargs = arg;
+ }
+ else if(Z_TYPE_P(arg) == IS_OBJECT && Z_OBJCE_P(arg) == initClass)
+ {
+ zvinit = arg;
+ }
+ else
+ {
+ invalidArgument("initialize expects an argument list, an InitializationData object, or both" TSRMLS_CC);
+ RETURN_NULL();
+ }
+ }
+
+ if(ZEND_NUM_ARGS() > 1)
{
- if(Z_TYPE_PP(args[0]) == IS_ARRAY)
+ zval* arg = *args[1];
+
+ if(Z_TYPE_P(arg) == IS_ARRAY)
{
- if(!extractStringArray(*args[0], seq TSRMLS_CC))
+ if(zvargs)
{
+ invalidArgument("unexpected array argument to initialize" TSRMLS_CC);
RETURN_NULL();
}
- zvargs = *args[0];
- hasArgs = true;
- if(ZEND_NUM_ARGS() > 1)
- {
- if(Z_TYPE_PP(args[1]) != IS_OBJECT || Z_OBJCE_PP(args[1]) != initClass)
- {
- string s = zendTypeToString(Z_TYPE_PP(args[1]));
- invalidArgument("expected InitializationData object but received %s" TSRMLS_CC, s.c_str());
- RETURN_NULL();
- }
- zvinit = *args[1];
- }
+ zvargs = arg;
}
- else if(Z_TYPE_PP(args[0]) == IS_OBJECT && Z_OBJCE_PP(args[0]) == initClass)
+ else if(Z_TYPE_P(arg) == IS_OBJECT && Z_OBJCE_P(arg) == initClass)
{
- if(ZEND_NUM_ARGS() > 1)
+ if(zvinit)
{
- runtimeError("too many arguments" TSRMLS_CC);
+ invalidArgument("unexpected InitializationData argument to initialize" TSRMLS_CC);
RETURN_NULL();
}
- zvinit = *args[0];
+ zvinit = arg;
}
else
{
- string s = zendTypeToString(Z_TYPE_PP(args[0]));
- invalidArgument("unexpected argument type %s" TSRMLS_CC, s.c_str());
+ invalidArgument("initialize expects an argument list, an InitializationData object, or both" TSRMLS_CC);
RETURN_NULL();
}
}
+ if(zvargs && !extractStringArray(zvargs, seq TSRMLS_CC))
+ {
+ RETURN_NULL();
+ }
+
if(zvinit)
{
void* data;
@@ -1177,7 +1199,7 @@ ZEND_FUNCTION(Ice_initialize)
initData.compactIdResolver = new IdResolver(TSRMLS_C);
initData.valueFactoryManager = new ValueFactoryManager;
- CommunicatorInfoIPtr info = initializeCommunicator(return_value, seq, hasArgs, initData TSRMLS_CC);
+ CommunicatorInfoIPtr info = initializeCommunicator(return_value, seq, zvargs != 0, initData TSRMLS_CC);
if(!info)
{
RETURN_NULL();