diff options
author | Mark Spruiell <mes@zeroc.com> | 2017-03-29 15:44:15 -0700 |
---|---|---|
committer | Mark Spruiell <mes@zeroc.com> | 2017-03-29 15:44:15 -0700 |
commit | a173aa6fe157e150c283fc88e8d33f3aa91a988c (patch) | |
tree | 9d7887cd9b025beb962486165d6b8b1ef200cd29 /php/src | |
parent | ICE-7716 - more scripting language fixes (diff) | |
download | ice-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.cpp | 76 |
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(); |