Beispiel #1
0
/**
 * Generates the code that calls a method, function or constructor
 * and returns the data
 *
 * @param array $method_definitions Data for the method or function.
 * @param string $method_name Name of the function.
 * @param string $class_name Name of parent class if applicable
 * @param bool $is_constructor Flag to indicate if constructor or just a regular method.
 *
 * @return string Generated code ready to insert on the end of
 * the PHP_METHOD or PHP_FUNCTION body after the generated code of class_method_called_overload()
 */
function function_return($method_definitions, $method_name, $class_name = null, $is_constructor = false)
{
    //Positions on the array of $method_definition where type and parameters data is stored
    $function_return_types = "return_type";
    $parameter_types = "parameters_type";
    $parameter_names = "parameters_name";
    $parameter_required = "parameters_required";
    $parameter_values = "parameters_default_value";
    $return_called_overload = "";
    foreach ($method_definitions as $declaration_index => $declaration) {
        $return_called_overload .= "if(overload{$declaration_index}_called)\n";
        $return_called_overload .= "\t{\n";
        $required_parameters = count($declaration[$parameter_required]);
        $parameters_count = count($declaration[$parameter_types]);
        //Generate code for object arguments
        foreach ($declaration[$parameter_types] as $parameter_index => $parameter_type) {
            $parameter_is_array = $declaration["parameters_is_array"][$parameter_index];
            $argument_type_modifier = "";
            $standard_parameter_type = parameter_type($parameter_type, $parameter_is_array, $method_name, $class_name, $argument_type_modifier);
            $plain_type = str_replace(array("const ", "&", "*"), "", $parameter_type);
            switch ($standard_parameter_type) {
                case "bool":
                    switch ($argument_type_modifier) {
                        case "const_pointer":
                            $return_called_overload .= tabs(2) . "int array_count{$declaration_index}_{$parameter_index} = 1;\n";
                            $return_called_overload .= tabs(2) . "HashTable* arr_hash{$declaration_index}_{$parameter_index};\n";
                            $return_called_overload .= tabs(2) . "if(arguments_received > {$parameter_index})\n";
                            $return_called_overload .= tabs(2) . "{\n";
                            $return_called_overload .= tabs(3) . "arr_hash{$declaration_index}_{$parameter_index} = Z_ARRVAL_P(" . $declaration[$parameter_names][$parameter_index] . $declaration_index . ");\n";
                            $return_called_overload .= tabs(3) . "array_count{$declaration_index}_{$parameter_index} = zend_hash_num_elements(arr_hash{$declaration_index}_{$parameter_index});\n";
                            $return_called_overload .= tabs(2) . "}\n";
                            $return_called_overload .= tabs(2) . "bool* bools_array{$declaration_index}_{$parameter_index} = new bool[array_count{$declaration_index}_{$parameter_index}];\n";
                            $return_called_overload .= tabs(2) . "bool bools_continue{$declaration_index}_{$parameter_index} = true;\n\n";
                            break;
                    }
                    break;
                case "integer":
                    switch ($argument_type_modifier) {
                        case "const_pointer":
                            $return_called_overload .= tabs(2) . "int array_count{$declaration_index}_{$parameter_index} = 1;\n";
                            $return_called_overload .= tabs(2) . "HashTable* arr_hash{$declaration_index}_{$parameter_index};\n";
                            $return_called_overload .= tabs(2) . "if(arguments_received > {$parameter_index})\n";
                            $return_called_overload .= tabs(2) . "{\n";
                            $return_called_overload .= tabs(3) . "arr_hash{$declaration_index}_{$parameter_index} = Z_ARRVAL_P(" . $declaration[$parameter_names][$parameter_index] . $declaration_index . ");\n";
                            $return_called_overload .= tabs(3) . "array_count{$declaration_index}_{$parameter_index} = zend_hash_num_elements(arr_hash{$declaration_index}_{$parameter_index});\n";
                            $return_called_overload .= tabs(2) . "}\n";
                            $return_called_overload .= tabs(2) . "{$plain_type}* integers_array{$declaration_index}_{$parameter_index} = new {$plain_type}[array_count{$declaration_index}_{$parameter_index}];\n";
                            $return_called_overload .= tabs(2) . "bool integers_continue{$declaration_index}_{$parameter_index} = true;\n\n";
                            break;
                    }
                    break;
                case "float":
                    switch ($argument_type_modifier) {
                        case "const_pointer":
                            $return_called_overload .= tabs(2) . "int array_count{$declaration_index}_{$parameter_index} = 1;\n";
                            $return_called_overload .= tabs(2) . "HashTable* arr_hash{$declaration_index}_{$parameter_index};\n";
                            $return_called_overload .= tabs(2) . "if(arguments_received > {$parameter_index})\n";
                            $return_called_overload .= tabs(2) . "{\n";
                            $return_called_overload .= tabs(3) . "arr_hash{$declaration_index}_{$parameter_index} = Z_ARRVAL_P(" . $declaration[$parameter_names][$parameter_index] . $declaration_index . ");\n";
                            $return_called_overload .= tabs(3) . "array_count{$declaration_index}_{$parameter_index} = zend_hash_num_elements(arr_hash{$declaration_index}_{$parameter_index});\n";
                            $return_called_overload .= tabs(2) . "}\n";
                            $return_called_overload .= tabs(2) . "{$plain_type}* floats_array{$declaration_index}_{$parameter_index} = new {$plain_type}[array_count{$declaration_index}_{$parameter_index}];\n";
                            $return_called_overload .= tabs(2) . "bool floats_continue{$declaration_index}_{$parameter_index} = true;\n\n";
                            break;
                    }
                    break;
                case "string":
                    switch ($argument_type_modifier) {
                        case "const_pointer":
                            //const wxString* Array
                        //const wxString* Array
                        case "const_reference_array":
                            //const wxString&[]
                        //const wxString&[]
                        case "const_none_array":
                            //const wxString[]
                        //const wxString[]
                        case "none_array":
                            //wxString[]
                            $return_called_overload .= tabs(2) . "int array_count{$declaration_index}_{$parameter_index} = 1;\n";
                            $return_called_overload .= tabs(2) . "HashTable* arr_hash{$declaration_index}_{$parameter_index};\n";
                            $return_called_overload .= tabs(2) . "if(arguments_received > {$parameter_index})\n";
                            $return_called_overload .= tabs(2) . "{\n";
                            $return_called_overload .= tabs(3) . "arr_hash{$declaration_index}_{$parameter_index} = Z_ARRVAL_P(" . $declaration[$parameter_names][$parameter_index] . $declaration_index . ");\n";
                            $return_called_overload .= tabs(3) . "array_count{$declaration_index}_{$parameter_index} = zend_hash_num_elements(arr_hash{$declaration_index}_{$parameter_index});\n";
                            $return_called_overload .= tabs(2) . "}\n";
                            $return_called_overload .= tabs(2) . "wxString* strings_array{$declaration_index}_{$parameter_index} = new wxString[array_count{$declaration_index}_{$parameter_index}];\n";
                            $return_called_overload .= tabs(2) . "bool strings_continue{$declaration_index}_{$parameter_index} = true;\n\n";
                            break;
                    }
                    break;
                case "strings_array":
                    $return_called_overload .= tabs(2) . "wxArrayString strings_array{$declaration_index}_{$parameter_index};\n";
                    $return_called_overload .= tabs(2) . "bool strings_continue{$declaration_index}_{$parameter_index} = true;\n\n";
                    break;
                case "date":
                    switch ($argument_type_modifier) {
                        case "const_pointer":
                            $return_called_overload .= tabs(2) . "int array_count{$declaration_index}_{$parameter_index} = 1;\n";
                            $return_called_overload .= tabs(2) . "HashTable* arr_hash{$declaration_index}_{$parameter_index};\n";
                            $return_called_overload .= tabs(2) . "if(arguments_received > {$parameter_index})\n";
                            $return_called_overload .= tabs(2) . "{\n";
                            $return_called_overload .= tabs(3) . "arr_hash{$declaration_index}_{$parameter_index} = Z_ARRVAL_P(" . $declaration[$parameter_names][$parameter_index] . $declaration_index . ");\n";
                            $return_called_overload .= tabs(3) . "array_count{$declaration_index}_{$parameter_index} = zend_hash_num_elements(arr_hash{$declaration_index}_{$parameter_index});\n";
                            $return_called_overload .= tabs(2) . "}\n";
                            $return_called_overload .= tabs(2) . "wxDateTime* dates_array{$declaration_index}_{$parameter_index} = new wxDateTime[array_count{$declaration_index}_{$parameter_index}];\n";
                            $return_called_overload .= tabs(2) . "bool dates_continue{$declaration_index}_{$parameter_index} = true;\n\n";
                            break;
                    }
                    break;
            }
        }
        $return_called_overload .= "\t\tswitch(arguments_received)\n";
        $return_called_overload .= "\t\t{\n";
        for ($required_parameters; $required_parameters <= $parameters_count; $required_parameters++) {
            $return_called_overload .= "\t\t\tcase {$required_parameters}:\n";
            $return_called_overload .= "\t\t\t{\n";
            $after_return_called_overload = "";
            //Holds code that sets reference variables (* or &)
            $after_constructor_called = "";
            //Holds code to execute after a constructor was called
            $parameters_string = "";
            for ($parameter_index = 0; $parameter_index < $required_parameters; $parameter_index++) {
                $parameter_is_array = $declaration["parameters_is_array"][$parameter_index];
                $declaration_modifier = "";
                $standard_parameter_type = parameter_type($declaration[$parameter_types][$parameter_index], $parameter_is_array, $method_name, $class_name, $declaration_modifier);
                $argument_parameter_type = str_replace(array("const ", "*", "&"), "", $declaration[$parameter_types][$parameter_index]);
                //Holds the name of the variable passed to called function
                $variable_name = $declaration[$parameter_names][$parameter_index] . $declaration_index;
                //Holds the name for the reference variable
                $reference_name = $declaration[$parameter_names][$parameter_index] . $declaration_index . "_ref";
                switch ($standard_parameter_type) {
                    case "bool":
                        switch ($declaration_modifier) {
                            case "pointer":
                                //bool*
                                $parameters_string .= $variable_name . ", ";
                                break;
                            case "const_pointer":
                                //const bool* Array
                                $return_called_overload .= tabs(4) . "int array_index{$declaration_index}_{$parameter_index} = 0;\n";
                                $return_called_overload .= tabs(4) . "zval** temp_array_value{$declaration_index}_{$parameter_index} = 0;\n";
                                $return_called_overload .= tabs(4) . "while(bools_continue{$declaration_index}_{$parameter_index})\n";
                                $return_called_overload .= tabs(4) . "{\n";
                                $return_called_overload .= tabs(5) . "if(zend_hash_index_find(HASH_OF(" . $variable_name . "), array_index{$declaration_index}_{$parameter_index}, (void**)&temp_array_value{$declaration_index}_{$parameter_index}) == SUCCESS)\n";
                                $return_called_overload .= tabs(5) . "{\n";
                                $return_called_overload .= tabs(6) . "convert_to_boolean_ex(temp_array_value{$declaration_index}_{$parameter_index});\n";
                                $return_called_overload .= tabs(6) . "bools_array{$declaration_index}_{$parameter_index}[array_index{$declaration_index}_{$parameter_index}] = Z_BVAL_PP(temp_array_value{$declaration_index}_{$parameter_index});\n";
                                $return_called_overload .= tabs(6) . "array_index{$declaration_index}_{$parameter_index}++;\n";
                                $return_called_overload .= tabs(5) . "}\n";
                                $return_called_overload .= tabs(5) . "else\n";
                                $return_called_overload .= tabs(5) . "{\n";
                                $return_called_overload .= tabs(6) . "bools_continue{$declaration_index}_{$parameter_index} = false;\n";
                                $return_called_overload .= tabs(5) . "}\n";
                                $return_called_overload .= tabs(4) . "}\n";
                                $parameters_string .= "bools_array{$declaration_index}_{$parameter_index}, ";
                                $after_return_called_overload .= tabs(4) . "delete[] bools_array{$declaration_index}_{$parameter_index};\n";
                                break;
                            case "reference":
                                //bool&
                                $parameters_string .= $variable_name . ", ";
                                break;
                            case "const_reference":
                                //const bool&
                            //const bool&
                            case "none":
                                //bool
                            //bool
                            case "const_none":
                                //const bool
                                $parameters_string .= $variable_name . ", ";
                                break;
                        }
                        //Code to set references
                        switch ($declaration_modifier) {
                            case "pointer":
                                $after_return_called_overload .= tabs(4) . "size_t elements_returned{$declaration_index}_{$parameter_index} = sizeof({$variable_name})/sizeof(*{$variable_name});\n";
                                $after_return_called_overload .= tabs(4) . "array_init({$reference_name});\n";
                                $after_return_called_overload .= tabs(4) . "for(size_t i=0; i<elements_returned{$declaration_index}_{$parameter_index}; i++)\n";
                                $after_return_called_overload .= tabs(4) . "{\n";
                                $after_return_called_overload .= tabs(5) . "add_next_index_long({$reference_name}, {$variable_name}[i]);\n";
                                $after_return_called_overload .= tabs(4) . "}\n";
                                break;
                            case "reference":
                                $after_return_called_overload .= tabs(4) . "ZVAL_BOOL({$reference_name}, {$variable_name});\n";
                                break;
                        }
                        break;
                    case "integer":
                    case "class_enum":
                    case "global_enum":
                        $integer_type = $class_enum . $declaration[$parameter_types][$parameter_index];
                        if ($enum_class = enum_parent_class($argument_parameter_type)) {
                            if ("" . strpos($integer_type, "{$enum_class}::") . "" == "") {
                                $integer_type = str_replace($argument_parameter_type, "{$enum_class}::{$argument_parameter_type}", $integer_type);
                            }
                        }
                        switch ($declaration_modifier) {
                            case "pointer":
                                //integer*
                                $parameters_string .= "(" . $integer_type . ") " . $variable_name . ", ";
                                break;
                            case "const_pointer":
                                //const integer* Array
                                $return_called_overload .= tabs(4) . "int array_index{$declaration_index}_{$parameter_index} = 0;\n";
                                $return_called_overload .= tabs(4) . "zval** temp_array_value{$declaration_index}_{$parameter_index} = 0;\n";
                                $return_called_overload .= tabs(4) . "while(integers_continue{$declaration_index}_{$parameter_index})\n";
                                $return_called_overload .= tabs(4) . "{\n";
                                $return_called_overload .= tabs(5) . "if(zend_hash_index_find(HASH_OF(" . $variable_name . "), array_index{$declaration_index}_{$parameter_index}, (void**)&temp_array_value{$declaration_index}_{$parameter_index}) == SUCCESS)\n";
                                $return_called_overload .= tabs(5) . "{\n";
                                $return_called_overload .= tabs(6) . "convert_to_long_ex(temp_array_value{$declaration_index}_{$parameter_index});\n";
                                $return_called_overload .= tabs(6) . "integers_array{$declaration_index}_{$parameter_index}[array_index{$declaration_index}_{$parameter_index}] = ({$argument_parameter_type}) Z_LVAL_PP(temp_array_value{$declaration_index}_{$parameter_index});\n";
                                $return_called_overload .= tabs(6) . "array_index{$declaration_index}_{$parameter_index}++;\n";
                                $return_called_overload .= tabs(5) . "}\n";
                                $return_called_overload .= tabs(5) . "else\n";
                                $return_called_overload .= tabs(5) . "{\n";
                                $return_called_overload .= tabs(6) . "integers_continue{$declaration_index}_{$parameter_index} = false;\n";
                                $return_called_overload .= tabs(5) . "}\n";
                                $return_called_overload .= tabs(4) . "}\n";
                                $parameters_string .= "(" . $integer_type . ") " . "integers_array{$declaration_index}_{$parameter_index}, ";
                                $after_return_called_overload .= tabs(4) . "delete[] integers_array{$declaration_index}_{$parameter_index};\n";
                                break;
                            case "reference":
                                //integer&
                                $parameters_string .= "(" . $integer_type . ") " . $variable_name . ", ";
                                break;
                            case "const_reference":
                                //const integer&
                            //const integer&
                            case "none":
                                //integer
                            //integer
                            case "const_none":
                                //const integer
                                $parameters_string .= "(" . $integer_type . ") " . $variable_name . ", ";
                                break;
                        }
                        //Code to set references
                        switch ($declaration_modifier) {
                            case "pointer":
                                $after_return_called_overload .= tabs(4) . "size_t elements_returned{$declaration_index}_{$parameter_index} = sizeof({$variable_name})/sizeof(*{$variable_name});\n";
                                $after_return_called_overload .= tabs(4) . "array_init({$reference_name});\n";
                                $after_return_called_overload .= tabs(4) . "for(size_t i=0; i<elements_returned{$declaration_index}_{$parameter_index}; i++)\n";
                                $after_return_called_overload .= tabs(4) . "{\n";
                                $after_return_called_overload .= tabs(5) . "add_next_index_long({$reference_name}, {$variable_name}[i]);\n";
                                $after_return_called_overload .= tabs(4) . "}\n";
                                break;
                            case "reference":
                                $after_return_called_overload .= tabs(4) . "ZVAL_LONG({$reference_name}, {$variable_name});\n";
                                break;
                        }
                        break;
                    case "float":
                        switch ($declaration_modifier) {
                            case "pointer":
                                //double*
                                $parameters_string .= $variable_name . ", ";
                                break;
                            case "const_pointer":
                                //const double* Array
                                $return_called_overload .= tabs(4) . "int array_index{$declaration_index}_{$parameter_index} = 0;\n";
                                $return_called_overload .= tabs(4) . "zval** temp_array_value{$declaration_index}_{$parameter_index} = 0;\n";
                                $return_called_overload .= tabs(4) . "while(floats_continue{$declaration_index}_{$parameter_index})\n";
                                $return_called_overload .= tabs(4) . "{\n";
                                $return_called_overload .= tabs(5) . "if(zend_hash_index_find(HASH_OF(" . $variable_name . "), array_index{$declaration_index}_{$parameter_index}, (void**)&temp_array_value{$declaration_index}_{$parameter_index}) == SUCCESS)\n";
                                $return_called_overload .= tabs(5) . "{\n";
                                $return_called_overload .= tabs(6) . "convert_to_double_ex(temp_array_value{$declaration_index}_{$parameter_index});\n";
                                $return_called_overload .= tabs(6) . "floats_array{$declaration_index}_{$parameter_index}[array_index{$declaration_index}_{$parameter_index}] = ({$argument_parameter_type}) Z_DVAL_PP(temp_array_value{$declaration_index}_{$parameter_index});\n";
                                $return_called_overload .= tabs(6) . "array_index{$declaration_index}_{$parameter_index}++;\n";
                                $return_called_overload .= tabs(5) . "}\n";
                                $return_called_overload .= tabs(5) . "else\n";
                                $return_called_overload .= tabs(5) . "{\n";
                                $return_called_overload .= tabs(6) . "floats_continue{$declaration_index}_{$parameter_index} = false;\n";
                                $return_called_overload .= tabs(5) . "}\n";
                                $return_called_overload .= tabs(4) . "}\n";
                                $parameters_string .= "(" . $declaration[$parameter_types][$parameter_index] . ") " . "floats_array{$declaration_index}_{$parameter_index}, ";
                                $after_return_called_overload .= tabs(4) . "delete[] floats_array{$declaration_index}_{$parameter_index};\n";
                                break;
                            case "reference":
                                //double&
                                $parameters_string .= $variable_name . ", ";
                                break;
                            case "const_reference":
                                //const double&
                            //const double&
                            case "none":
                                //double
                            //double
                            case "const_none":
                                //const double
                                $parameters_string .= $variable_name . ", ";
                                break;
                        }
                        //Code to set references
                        switch ($declaration_modifier) {
                            case "pointer":
                                $after_return_called_overload .= tabs(4) . "size_t elements_returned{$declaration_index}_{$parameter_index} = sizeof({$variable_name})/sizeof(*{$variable_name});\n";
                                $after_return_called_overload .= tabs(4) . "array_init({$reference_name});\n";
                                $after_return_called_overload .= tabs(4) . "for(size_t i=0; i<elements_returned{$declaration_index}_{$parameter_index}; i++)\n";
                                $after_return_called_overload .= tabs(4) . "{\n";
                                $after_return_called_overload .= tabs(5) . "add_next_index_long({$reference_name}, {$variable_name}[i]);\n";
                                $after_return_called_overload .= tabs(4) . "}\n";
                                break;
                            case "reference":
                                $after_return_called_overload .= tabs(4) . "ZVAL_DOUBLE({$reference_name}, {$variable_name});\n";
                                break;
                        }
                        break;
                    case "characters":
                        switch ($declaration_modifier) {
                            case "pointer":
                                //char* Array with reference
                            //char* Array with reference
                            case "const_pointer":
                                //const char* Array
                                $parameters_string .= $variable_name . ", ";
                                break;
                            case "reference":
                                //char&
                                $parameters_string .= "(" . $declaration[$parameter_types][$parameter_index] . ") " . $variable_name . ", ";
                                break;
                            case "const_reference":
                                //const char&
                            //const char&
                            case "none":
                                //char
                            //char
                            case "const_none":
                                //const char
                                $parameters_string .= "(" . $declaration[$parameter_types][$parameter_index] . ") " . $variable_name . ", ";
                                break;
                        }
                        //Code to set references
                        switch ($declaration_modifier) {
                            case "pointer":
                                $after_return_called_overload .= tabs(4) . "ZVAL_STRING({$reference_name}, {$variable_name}, 1);\n";
                                break;
                            case "reference":
                                $after_return_called_overload .= tabs(4) . "ZVAL_LONG({$reference_name}, {$variable_name});\n";
                                break;
                        }
                        break;
                    case "void":
                        switch ($declaration_modifier) {
                            case "pointer":
                                //void*
                            //void*
                            case "const_pointer":
                                //const void*
                                $parameters_string .= "(" . $declaration[$parameter_types][$parameter_index] . ") " . $variable_name . ", ";
                                break;
                                //Not handled for now
                            //Not handled for now
                            case "pointer_pointer":
                            case "const_pointer_pointer":
                                $parameters_string .= "(void**) 0, ";
                                break;
                        }
                        //Code to set references
                        switch ($declaration_modifier) {
                            case "pointer":
                                $after_return_called_overload .= tabs(4) . "ZVAL_STRING({$reference_name}, (char*) {$variable_name}, 1);\n";
                                break;
                        }
                        break;
                    case "date":
                        switch ($declaration_modifier) {
                            case "pointer":
                                //date*
                                $return_called_overload .= tabs(4) . "wxDateTime date_time{$declaration_index}_{$parameter_index} = wxDateTime(" . $variable_name . ");\n";
                                $parameters_string .= "&date_time{$declaration_index}_{$parameter_index}, ";
                                break;
                            case "const_pointer":
                                //const date* Array
                                $return_called_overload .= tabs(4) . "int array_index{$declaration_index}_{$parameter_index} = 0;\n";
                                $return_called_overload .= tabs(4) . "zval** temp_array_value{$declaration_index}_{$parameter_index} = 0;\n";
                                $return_called_overload .= tabs(4) . "while(dates_continue{$declaration_index}_{$parameter_index})\n";
                                $return_called_overload .= tabs(4) . "{\n";
                                $return_called_overload .= tabs(5) . "if(zend_hash_index_find(HASH_OF(" . $variable_name . "), array_index{$declaration_index}_{$parameter_index}, (void**)&temp_array_value{$declaration_index}_{$parameter_index}) == SUCCESS)\n";
                                $return_called_overload .= tabs(5) . "{\n";
                                $return_called_overload .= tabs(6) . "convert_to_long_ex(temp_array_value{$declaration_index}_{$parameter_index});\n";
                                $return_called_overload .= tabs(6) . "dates_array{$declaration_index}_{$parameter_index}[array_index{$declaration_index}_{$parameter_index}] = wxDateTime((time_t) Z_LVAL_PP(temp_array_value{$declaration_index}_{$parameter_index}));\n";
                                $return_called_overload .= tabs(6) . "array_index{$declaration_index}_{$parameter_index}++;\n";
                                $return_called_overload .= tabs(5) . "}\n";
                                $return_called_overload .= tabs(5) . "else\n";
                                $return_called_overload .= tabs(5) . "{\n";
                                $return_called_overload .= tabs(6) . "dates_continue{$declaration_index}_{$parameter_index} = false;\n";
                                $return_called_overload .= tabs(5) . "}\n";
                                $return_called_overload .= tabs(4) . "}\n";
                                $parameters_string .= "dates_array{$declaration_index}_{$parameter_index}, ";
                                $after_return_called_overload .= tabs(4) . "delete[] dates_array{$declaration_index}_{$parameter_index};\n";
                                break;
                            case "reference":
                                //date&
                                $return_called_overload .= tabs(4) . "wxDateTime date_time{$declaration_index}_{$parameter_index} = wxDateTime(" . $variable_name . ");\n";
                                $parameters_string .= "date_time{$declaration_index}_{$parameter_index}, ";
                                break;
                            case "const_reference":
                                //const date&
                            //const date&
                            case "none":
                                //date
                            //date
                            case "const_none":
                                //const date
                                $parameters_string .= "wxDateTime(" . $variable_name . "), ";
                                break;
                        }
                        //Code to set references
                        switch ($declaration_modifier) {
                            case "pointer":
                            case "reference":
                                $after_return_called_overload .= tabs(4) . "ZVAL_LONG({$reference_name}, date_time{$declaration_index}_{$parameter_index}.GetTicks());\n";
                                break;
                        }
                        break;
                    case "string":
                        switch ($declaration_modifier) {
                            case "pointer":
                                //wxString*
                                $return_called_overload .= tabs(4) . "wxString string_arg{$declaration_index}_{$parameter_index} = wxString(" . $variable_name . ", wxConvUTF8);\n";
                                $parameters_string .= "&string_arg{$declaration_index}_{$parameter_index}, ";
                                break;
                            case "const_pointer":
                                //const wxString* Array
                            //const wxString* Array
                            case "const_reference_array":
                                //const wxString&[]
                            //const wxString&[]
                            case "const_none_array":
                                //const wxString[]
                            //const wxString[]
                            case "none_array":
                                //wxString[]
                                $return_called_overload .= tabs(4) . "int array_index{$declaration_index}_{$parameter_index} = 0;\n";
                                $return_called_overload .= tabs(4) . "zval** temp_array_value{$declaration_index}_{$parameter_index} = 0;\n";
                                $return_called_overload .= tabs(4) . "while(strings_continue{$declaration_index}_{$parameter_index})\n";
                                $return_called_overload .= tabs(4) . "{\n";
                                $return_called_overload .= tabs(5) . "if(zend_hash_index_find(HASH_OF(" . $variable_name . "), array_index{$declaration_index}_{$parameter_index}, (void**)&temp_array_value{$declaration_index}_{$parameter_index}) == SUCCESS)\n";
                                $return_called_overload .= tabs(5) . "{\n";
                                $return_called_overload .= tabs(6) . "convert_to_string(*temp_array_value{$declaration_index}_{$parameter_index});\n";
                                $return_called_overload .= tabs(6) . "strings_array{$declaration_index}_{$parameter_index}[array_index{$declaration_index}_{$parameter_index}] = wxString(Z_STRVAL_PP(temp_array_value{$declaration_index}_{$parameter_index}), wxConvUTF8);\n";
                                $return_called_overload .= tabs(6) . "array_index{$declaration_index}_{$parameter_index}++;\n";
                                $return_called_overload .= tabs(5) . "}\n";
                                $return_called_overload .= tabs(5) . "else\n";
                                $return_called_overload .= tabs(5) . "{\n";
                                $return_called_overload .= tabs(6) . "strings_continue{$declaration_index}_{$parameter_index} = false;\n";
                                $return_called_overload .= tabs(5) . "}\n";
                                $return_called_overload .= tabs(4) . "}\n";
                                $parameters_string .= "strings_array{$declaration_index}_{$parameter_index}, ";
                                $after_return_called_overload .= tabs(4) . "delete[] strings_array{$declaration_index}_{$parameter_index};\n";
                                break;
                            case "reference":
                                //wxString&
                                $return_called_overload .= tabs(4) . "wxString string_arg{$declaration_index}_{$parameter_index} = wxString(" . $variable_name . ", wxConvUTF8);\n";
                                $parameters_string .= "string_arg{$declaration_index}_{$parameter_index}, ";
                                break;
                            case "const_reference":
                                //const wxString&
                            //const wxString&
                            case "none":
                                //char
                            //char
                            case "const_none":
                                //const wxString
                                $parameters_string .= "wxString(" . $variable_name . ", wxConvUTF8), ";
                                break;
                        }
                        //Code to set references
                        switch ($declaration_modifier) {
                            case "pointer":
                            case "reference":
                                $after_return_called_overload .= tabs(4) . "char* temp_string{$declaration_index}_{$parameter_index};\n";
                                $after_return_called_overload .= tabs(4) . "temp_string{$declaration_index}_{$parameter_index} = (char*)malloc(sizeof(wxChar)*(string_arg{$declaration_index}_{$parameter_index}.size()+1));\n";
                                $after_return_called_overload .= tabs(4) . "strcpy (temp_string{$declaration_index}_{$parameter_index}, (const char *) string_arg{$declaration_index}_{$parameter_index}.char_str() );\n";
                                $after_return_called_overload .= tabs(4) . "ZVAL_STRING({$reference_name}, (char*) temp_string{$declaration_index}_{$parameter_index}, 1);\n";
                                $after_return_called_overload .= tabs(4) . "free(temp_string{$declaration_index}_{$parameter_index});\n\n";
                                break;
                        }
                        break;
                    case "strings_array":
                        $return_called_overload .= tabs(4) . "int array_index{$declaration_index}_{$parameter_index} = 0;\n";
                        $return_called_overload .= tabs(4) . "zval** temp_array_value{$declaration_index}_{$parameter_index} = 0;\n";
                        $return_called_overload .= tabs(4) . "while(strings_continue{$declaration_index}_{$parameter_index})\n";
                        $return_called_overload .= tabs(4) . "{\n";
                        $return_called_overload .= tabs(5) . "if(zend_hash_index_find(HASH_OF(" . $variable_name . "), array_index{$declaration_index}_{$parameter_index}, (void**)&temp_array_value{$declaration_index}_{$parameter_index}) == SUCCESS)\n";
                        $return_called_overload .= tabs(5) . "{\n";
                        $return_called_overload .= tabs(6) . "convert_to_string(*temp_array_value{$declaration_index}_{$parameter_index});\n";
                        $return_called_overload .= tabs(6) . "strings_array{$declaration_index}_{$parameter_index}.Add(wxString(Z_STRVAL_PP(temp_array_value{$declaration_index}_{$parameter_index}), wxConvUTF8));\n";
                        $return_called_overload .= tabs(6) . "array_index{$declaration_index}_{$parameter_index}++;\n";
                        $return_called_overload .= tabs(5) . "}\n";
                        $return_called_overload .= tabs(5) . "else\n";
                        $return_called_overload .= tabs(5) . "{\n";
                        $return_called_overload .= tabs(6) . "strings_continue{$declaration_index}_{$parameter_index} = false;\n";
                        $return_called_overload .= tabs(5) . "}\n";
                        $return_called_overload .= tabs(4) . "}\n";
                        switch ($declaration_modifier) {
                            case "const_pointer":
                            case "pointer":
                                $parameters_string .= "&strings_array{$declaration_index}_{$parameter_index}, ";
                                break;
                            case "const_reference":
                            case "reference":
                            case "const_none":
                            case "none":
                                $parameters_string .= "strings_array{$declaration_index}_{$parameter_index}, ";
                                break;
                        }
                        //Code to set references
                        switch ($declaration_modifier) {
                            case "pointer":
                            case "reference":
                                $after_return_called_overload .= tabs(4) . "char* temp_string{$declaration_index}_{$parameter_index};\n";
                                $after_return_called_overload .= tabs(4) . "array_init({$variable_name});\n";
                                $after_return_called_overload .= tabs(4) . "for(size_t i=0; i<strings_array{$declaration_index}_{$parameter_index}.GetCount(); i++)\n";
                                $after_return_called_overload .= tabs(4) . "{\n";
                                $after_return_called_overload .= tabs(5) . "temp_string{$declaration_index}_{$parameter_index} = (char*)malloc(sizeof(wxChar)*(strings_array{$declaration_index}_{$parameter_index}[i].size()+1));\n";
                                $after_return_called_overload .= tabs(5) . "strcpy (temp_string{$declaration_index}_{$parameter_index}, (const char *) strings_array{$declaration_index}_{$parameter_index}[i].char_str() );\n";
                                $after_return_called_overload .= tabs(5) . "add_next_index_string({$variable_name}, (char*) temp_string{$declaration_index}_{$parameter_index}, 1);\n";
                                $after_return_called_overload .= tabs(5) . "free(temp_string{$declaration_index}_{$parameter_index});\n\n";
                                $after_return_called_overload .= tabs(4) . "}\n";
                                break;
                        }
                        break;
                    case "object":
                        switch ($declaration_modifier) {
                            case "pointer":
                                //object* Array with reference
                            //object* Array with reference
                            case "const_pointer":
                                //const object* Array
                                $parameters_string .= "(" . $declaration[$parameter_types][$parameter_index] . ") object_pointer{$declaration_index}_{$parameter_index}" . ", ";
                                if (!$declaration["static"] && $class_name && !$is_constructor) {
                                    $after_return_called_overload .= tabs(4) . "references->AddReference({$variable_name}, \"{$class_name}::{$method_name} at call with {$required_parameters} argument(s)\");\n";
                                } else {
                                    if ($is_constructor) {
                                        $after_constructor_called .= tabs(4) . "(({$class_name}_php*) native_object)->references.AddReference({$variable_name}, \"{$class_name}::{$method_name} at call with {$required_parameters} argument(s)\");\n";
                                    }
                                }
                                break;
                            case "reference":
                                //object&
                            //object&
                            case "const_reference":
                                //const object&
                                $parameters_string .= "*(" . $argument_parameter_type . "*) object_pointer{$declaration_index}_{$parameter_index}" . ", ";
                                if (!$declaration["static"] && $class_name && !$is_constructor) {
                                    $after_return_called_overload .= tabs(4) . "references->AddReference({$variable_name}, \"{$class_name}::{$method_name} at call with {$required_parameters} argument(s)\");\n";
                                } else {
                                    if ($is_constructor) {
                                        $after_constructor_called .= tabs(4) . "(({$class_name}_php*) native_object)->references.AddReference({$variable_name}, \"{$class_name}::{$method_name} at call with {$required_parameters} argument(s)\");\n";
                                    }
                                }
                                break;
                            case "none":
                                //char
                            //char
                            case "const_none":
                                //const object
                                $parameters_string .= "*(" . $argument_parameter_type . "*) object_pointer{$declaration_index}_{$parameter_index}" . ", ";
                                break;
                        }
                        break;
                }
            }
            $parameters_string = trim($parameters_string, ", ");
            if (!$is_constructor) {
                $parameter_is_array = $declaration["parameters_is_array"][$parameter_index];
                $return_modifier = "";
                $standard_return_type = parameter_type($declaration[$function_return_types], $parameter_is_array, $method_name, $class_name, $return_modifier);
                $return_type = str_replace(array("const ", "*", "&"), "", $declaration[$function_return_types]);
                $class_name_ex = $class_name;
                if (isset($declaration["override_class"])) {
                    $class_name_ex = $declaration["override_class"];
                }
                switch ($standard_return_type) {
                    case "bool":
                        $return_called_overload .= tabs(4) . "#ifdef USE_WXPHP_DEBUG\n";
                        if ($declaration["static"]) {
                            $return_called_overload .= tabs(4) . "php_printf(\"Static \");\n";
                        }
                        $return_called_overload .= tabs(4) . "php_printf(\"Executing RETURN_BOOL({$class_name_ex}::{$method_name}({$parameters_string}))\\n\\n\");\n";
                        $return_called_overload .= tabs(4) . "#endif\n\n";
                        if ($class_name == null) {
                            $return_called_overload .= function_return_call($method_name, $parameters_string, $required_parameters, $standard_return_type, $declaration[$function_return_types]);
                        } elseif (!$declaration["static"]) {
                            $return_called_overload .= class_method_return_call($class_name_ex, $method_name, $parameters_string, $required_parameters, $standard_return_type, $declaration[$function_return_types]);
                        } else {
                            switch ($return_modifier) {
                                case "pointer":
                                case "const_pointer":
                                    $return_called_overload .= tabs(4) . "ZVAL_BOOL(return_value, *({$class_name_ex}::{$method_name}({$parameters_string})));\n";
                                    break;
                                default:
                                    $return_called_overload .= tabs(4) . "ZVAL_BOOL(return_value, {$class_name_ex}::{$method_name}({$parameters_string}));\n";
                                    break;
                            }
                        }
                        break;
                    case "integer":
                    case "class_enum":
                    case "global_enum":
                        $return_called_overload .= tabs(4) . "#ifdef USE_WXPHP_DEBUG\n";
                        if ($declaration["static"]) {
                            $return_called_overload .= tabs(4) . "php_printf(\"Static \");\n";
                        }
                        $return_called_overload .= tabs(4) . "php_printf(\"Executing RETURN_LONG({$class_name_ex}::{$method_name}({$parameters_string}))\\n\\n\");\n";
                        $return_called_overload .= tabs(4) . "#endif\n\n";
                        if ($class_name == null) {
                            $return_called_overload .= function_return_call($method_name, $parameters_string, $required_parameters, $standard_return_type, $declaration[$function_return_types]);
                        } elseif (!$declaration["static"]) {
                            $return_called_overload .= class_method_return_call($class_name_ex, $method_name, $parameters_string, $required_parameters, $standard_return_type, $declaration[$function_return_types]);
                        } else {
                            switch ($return_modifier) {
                                case "pointer":
                                case "const_pointer":
                                    $return_called_overload .= tabs(4) . "ZVAL_LONG(return_value, *({$class_name_ex}::{$method_name}({$parameters_string})));\n";
                                    break;
                                default:
                                    $return_called_overload .= tabs(4) . "ZVAL_LONG(return_value, {$class_name_ex}::{$method_name}({$parameters_string}));\n";
                                    break;
                            }
                        }
                        break;
                    case "float":
                        $return_called_overload .= tabs(4) . "#ifdef USE_WXPHP_DEBUG\n";
                        if ($declaration["static"]) {
                            $return_called_overload .= tabs(4) . "php_printf(\"Static \");\n";
                        }
                        $return_called_overload .= tabs(4) . "php_printf(\"Executing RETURN_LONG({$class_name_ex}::{$method_name}({$parameters_string}))\\n\\n\");\n";
                        $return_called_overload .= tabs(4) . "#endif\n\n";
                        if ($class_name == null) {
                            $return_called_overload .= function_return_call($method_name, $parameters_string, $required_parameters, $standard_return_type, $declaration[$function_return_types]);
                        } elseif (!$declaration["static"]) {
                            $return_called_overload .= class_method_return_call($class_name_ex, $method_name, $parameters_string, $required_parameters, $standard_return_type, $declaration[$function_return_types]);
                        } else {
                            switch ($return_modifier) {
                                case "pointer":
                                case "const_pointer":
                                    $return_called_overload .= tabs(4) . "ZVAL_DOUBLE(return_value, *({$class_name_ex}::{$method_name}({$parameters_string})));\n";
                                    break;
                                default:
                                    $return_called_overload .= tabs(4) . "ZVAL_DOUBLE(return_value, {$class_name_ex}::{$method_name}({$parameters_string}));\n";
                                    break;
                            }
                        }
                        break;
                    case "characters":
                        $return_called_overload .= tabs(4) . "#ifdef USE_WXPHP_DEBUG\n";
                        if ($declaration["static"]) {
                            $return_called_overload .= tabs(4) . "php_printf(\"Static \");\n";
                        }
                        $return_called_overload .= tabs(4) . "php_printf(\"Executing RETURN_STRING({$class_name_ex}::{$method_name}({$parameters_string}).fn_str(), 1)\\n\\n\");\n";
                        $return_called_overload .= tabs(4) . "#endif\n\n";
                        $return_called_overload .= tabs(4) . $return_type . "* value_to_return{$required_parameters};\n";
                        if ($class_name == null) {
                            $return_called_overload .= function_return_call($method_name, $parameters_string, $required_parameters, $standard_return_type, $declaration[$function_return_types]);
                        } elseif (!$declaration["static"]) {
                            $return_called_overload .= class_method_return_call($class_name_ex, $method_name, $parameters_string, $required_parameters, $standard_return_type, $declaration[$function_return_types]);
                        } else {
                            $return_called_overload .= tabs(4) . "value_to_return{$required_parameters} = {$class_name_ex}::{$method_name}({$parameters_string});\n";
                        }
                        $return_called_overload .= tabs(4) . "ZVAL_STRING(return_value, value_to_return{$required_parameters}, 1);\n";
                        break;
                    case "void":
                        $return_called_overload .= tabs(4) . "#ifdef USE_WXPHP_DEBUG\n";
                        if ($declaration["static"]) {
                            $return_called_overload .= tabs(4) . "php_printf(\"Static \");\n";
                        }
                        $return_called_overload .= tabs(4) . "php_printf(\"Executing {$class_name_ex}::{$method_name}({$parameters_string})\\n\\n\");\n";
                        $return_called_overload .= tabs(4) . "#endif\n\n";
                        if ($class_name == null) {
                            $return_called_overload .= function_return_call($method_name, $parameters_string, $required_parameters, $standard_return_type, $declaration[$function_return_types]);
                        } elseif (!$declaration["static"]) {
                            $return_called_overload .= class_method_return_call($class_name_ex, $method_name, $parameters_string, $required_parameters, $standard_return_type, $declaration[$function_return_types]);
                        } else {
                            $return_called_overload .= tabs(4) . "{$class_name_ex}::{$method_name}({$parameters_string});\n";
                        }
                        break;
                    case "date":
                        $return_called_overload .= tabs(4) . "#ifdef USE_WXPHP_DEBUG\n";
                        if ($declaration["static"]) {
                            $return_called_overload .= tabs(4) . "php_printf(\"Static \");\n";
                        }
                        $return_called_overload .= tabs(4) . "php_printf(\"Executing {$class_name_ex}::{$method_name}({$parameters_string}) to return timestamp\\n\\n\");\n";
                        $return_called_overload .= tabs(4) . "#endif\n\n";
                        $return_type = "time_t";
                        $return_called_overload .= tabs(4) . $return_type . " value_to_return{$required_parameters};\n";
                        if ($class_name == null) {
                            $return_called_overload .= function_return_call($method_name, $parameters_string, $required_parameters, $standard_return_type, $declaration[$function_return_types]);
                        } elseif (!$declaration["static"]) {
                            $return_called_overload .= class_method_return_call($class_name_ex, $method_name, $parameters_string, $required_parameters, $standard_return_type, $declaration[$function_return_types]);
                        } else {
                            $return_called_overload .= tabs(4) . "value_to_return{$required_parameters} = {$class_name_ex}::{$method_name}({$parameters_string}).GetTicks();\n";
                        }
                        $return_called_overload .= tabs(4) . "ZVAL_LONG(return_value, value_to_return{$required_parameters});\n";
                        break;
                    case "string":
                        $return_called_overload .= tabs(4) . "#ifdef USE_WXPHP_DEBUG\n";
                        if ($declaration["static"]) {
                            $return_called_overload .= tabs(4) . "php_printf(\"Static \");\n";
                        }
                        $return_called_overload .= tabs(4) . "php_printf(\"Executing RETURN_STRING({$class_name_ex}::{$method_name}({$parameters_string}).fn_str(), 1)\\n\\n\");\n";
                        $return_called_overload .= tabs(4) . "#endif\n\n";
                        $return_called_overload .= tabs(4) . $return_type . " value_to_return{$required_parameters};\n";
                        if ($class_name == null) {
                            $return_called_overload .= function_return_call($method_name, $parameters_string, $required_parameters, $standard_return_type, $declaration[$function_return_types]);
                        } elseif (!$declaration["static"]) {
                            $return_called_overload .= class_method_return_call($class_name_ex, $method_name, $parameters_string, $required_parameters, $standard_return_type, $declaration[$function_return_types]);
                        } else {
                            $return_called_overload .= tabs(4) . "value_to_return{$required_parameters} = {$class_name_ex}::{$method_name}({$parameters_string});\n";
                        }
                        $return_called_overload .= tabs(4) . "char* temp_string{$required_parameters};\n";
                        $return_called_overload .= tabs(4) . "temp_string{$required_parameters} = (char*)malloc(sizeof(wxChar)*(value_to_return{$required_parameters}.size()+1));\n";
                        $return_called_overload .= tabs(4) . "strcpy (temp_string{$required_parameters}, (const char *) value_to_return{$required_parameters}.char_str() );\n";
                        $return_called_overload .= tabs(4) . "ZVAL_STRING(return_value, temp_string{$required_parameters}, 1);\n";
                        $return_called_overload .= tabs(4) . "free(temp_string{$required_parameters});\n";
                        break;
                    case "strings_array":
                        $return_called_overload .= tabs(4) . "#ifdef USE_WXPHP_DEBUG\n";
                        if ($declaration["static"]) {
                            $return_called_overload .= tabs(4) . "php_printf(\"Static \");\n";
                        }
                        $return_called_overload .= tabs(4) . "php_printf(\"Executing {$class_name_ex}::{$method_name}({$parameters_string}) to return strings array\\n\\n\");\n";
                        $return_called_overload .= tabs(4) . "#endif\n\n";
                        $return_type = str_replace(array("const", " ", "&"), "", $declaration[$function_return_types]);
                        $return_called_overload .= tabs(4) . $return_type . " value_to_return{$required_parameters};\n";
                        if ($class_name == null) {
                            $return_called_overload .= function_return_call($method_name, $parameters_string, $required_parameters, $standard_return_type, $declaration[$function_return_types]);
                        } elseif (!$declaration["static"]) {
                            $return_called_overload .= class_method_return_call($class_name_ex, $method_name, $parameters_string, $required_parameters, $standard_return_type, $declaration[$function_return_types]);
                        } else {
                            $return_called_overload .= tabs(4) . "value_to_return{$required_parameters} = {$class_name_ex}::{$method_name}({$parameters_string});\n";
                        }
                        $return_called_overload .= tabs(4) . "char* temp_string{$required_parameters};\n";
                        $return_called_overload .= tabs(4) . "array_init(return_value);\n";
                        $return_called_overload .= tabs(4) . "for(size_t i=0; i<value_to_return{$required_parameters}.GetCount(); i++)\n";
                        $return_called_overload .= tabs(4) . "{\n";
                        $return_called_overload .= tabs(5) . "temp_string{$required_parameters} = (char*)malloc(sizeof(wxChar)*(value_to_return{$required_parameters}[i].size()+1));\n";
                        $return_called_overload .= tabs(5) . "strcpy (temp_string{$required_parameters}, (const char *) value_to_return{$required_parameters}[i].char_str() );\n";
                        $return_called_overload .= tabs(5) . "add_next_index_string(return_value, (char*) temp_string{$required_parameters}, 1);\n";
                        $return_called_overload .= tabs(5) . "free(temp_string{$required_parameters});\n";
                        $return_called_overload .= tabs(4) . "}\n";
                        break;
                    case "object":
                        switch ($return_modifier) {
                            case "pointer":
                            case "const_pointer":
                                $return_called_overload .= tabs(4) . "#ifdef USE_WXPHP_DEBUG\n";
                                if ($declaration["static"]) {
                                    $return_called_overload .= tabs(4) . "php_printf(\"Static \");\n";
                                }
                                $return_called_overload .= tabs(4) . "php_printf(\"Executing {$class_name_ex}::{$method_name}({$parameters_string}) to return object pointer\\n\\n\");\n";
                                $return_called_overload .= tabs(4) . "#endif\n\n";
                                $return_called_overload .= tabs(4) . $return_type . "_php* value_to_return{$required_parameters};\n";
                                if ($class_name == null) {
                                    $return_called_overload .= function_return_call($method_name, $parameters_string, $required_parameters, $standard_return_type, $declaration[$function_return_types]);
                                } elseif (!$declaration["static"]) {
                                    $return_called_overload .= class_method_return_call($class_name_ex, $method_name, $parameters_string, $required_parameters, $standard_return_type, $declaration[$function_return_types]);
                                } else {
                                    $return_called_overload .= tabs(4) . "value_to_return{$required_parameters} = ({$return_type}_php*) {$class_name_ex}::{$method_name}({$parameters_string});\n";
                                }
                                $return_called_overload .= tabs(4) . "if(value_to_return{$required_parameters} == NULL){\n";
                                $return_called_overload .= tabs(5) . "ZVAL_NULL(return_value);\n";
                                $return_called_overload .= tabs(4) . "}\n";
                                $return_called_overload .= tabs(4) . "else if(value_to_return{$required_parameters}->references.IsUserInitialized()){\n";
                                $return_called_overload .= tabs(5) . "if(value_to_return{$required_parameters}->phpObj != NULL){\n";
                                $return_called_overload .= tabs(6) . "*return_value = *value_to_return{$required_parameters}->phpObj;\n";
                                $return_called_overload .= tabs(6) . "zval_add_ref(&value_to_return{$required_parameters}->phpObj);\n";
                                $return_called_overload .= tabs(6) . "return_is_user_initialized = true;\n";
                                $return_called_overload .= tabs(5) . "}\n";
                                $return_called_overload .= tabs(5) . "else{\n";
                                $return_called_overload .= tabs(6) . "zend_error(E_ERROR, \"Could not retreive original zval.\");\n";
                                $return_called_overload .= tabs(5) . "}\n";
                                $return_called_overload .= tabs(4) . "}\n";
                                $return_called_overload .= tabs(4) . "else{\n";
                                $return_called_overload .= tabs(5) . "object_init_ex(return_value, php_{$return_type}_entry);\n";
                                $return_called_overload .= tabs(5) . "((zo_{$return_type}*) zend_object_store_get_object(return_value TSRMLS_CC))->native_object = ({$return_type}_php*) value_to_return{$required_parameters};\n";
                                $return_called_overload .= tabs(4) . "}\n\n";
                                if (!$declaration["static"] && $class_name) {
                                    $return_called_overload .= tabs(4) . "if(Z_TYPE_P(return_value) != IS_NULL && (void*)value_to_return{$required_parameters} != (void*)native_object && return_is_user_initialized){\n";
                                    $return_called_overload .= tabs(5) . "references->AddReference(return_value, \"{$class_name_ex}::{$method_name} at call with {$required_parameters} argument(s)\");\n";
                                    $return_called_overload .= tabs(4) . "}\n";
                                }
                                break;
                            case "const_reference":
                            case "reference":
                                $return_called_overload .= tabs(4) . "#ifdef USE_WXPHP_DEBUG\n";
                                if ($declaration["static"]) {
                                    $return_called_overload .= tabs(4) . "php_printf(\"Static \");\n";
                                }
                                $return_called_overload .= tabs(4) . "php_printf(\"Executing {$class_name_ex}::{$method_name}({$parameters_string}) to return object reference\\n\\n\");\n";
                                $return_called_overload .= tabs(4) . "#endif\n\n";
                                $return_called_overload .= tabs(4) . $return_type . "_php* value_to_return{$required_parameters};\n";
                                if ($class_name == null) {
                                    $return_called_overload .= function_return_call($method_name, $parameters_string, $required_parameters, $standard_return_type, $declaration[$function_return_types]);
                                } elseif (!$declaration["static"]) {
                                    $return_called_overload .= class_method_return_call($class_name_ex, $method_name, $parameters_string, $required_parameters, $standard_return_type, $declaration[$function_return_types]);
                                } else {
                                    $return_called_overload .= tabs(4) . "value_to_return{$required_parameters} = ({$return_type}_php*) &{$class_name_ex}::{$method_name}({$parameters_string});\n";
                                }
                                $return_called_overload .= tabs(4) . "if(value_to_return{$required_parameters}->references.IsUserInitialized()){\n";
                                $return_called_overload .= tabs(5) . "if(value_to_return{$required_parameters}->phpObj != NULL){\n";
                                $return_called_overload .= tabs(6) . "*return_value = *value_to_return{$required_parameters}->phpObj;\n";
                                $return_called_overload .= tabs(6) . "zval_add_ref(&value_to_return{$required_parameters}->phpObj);\n";
                                $return_called_overload .= tabs(6) . "return_is_user_initialized = true;\n";
                                $return_called_overload .= tabs(5) . "}\n";
                                $return_called_overload .= tabs(5) . "else{\n";
                                $return_called_overload .= tabs(6) . "zend_error(E_ERROR, \"Could not retreive original zval.\");\n";
                                $return_called_overload .= tabs(5) . "}\n";
                                $return_called_overload .= tabs(4) . "}\n";
                                $return_called_overload .= tabs(4) . "else{\n";
                                $return_called_overload .= tabs(5) . "object_init_ex(return_value,php_{$return_type}_entry);\n";
                                $return_called_overload .= tabs(5) . "((zo_{$return_type}*) zend_object_store_get_object(return_value TSRMLS_CC))->native_object = ({$return_type}_php*) value_to_return{$required_parameters};\n";
                                $return_called_overload .= tabs(4) . "}\n\n";
                                if (!$declaration["static"] && $class_name) {
                                    $return_called_overload .= tabs(4) . "if((void*)value_to_return{$required_parameters} != (void*)native_object && return_is_user_initialized){ //Prevent adding references to it self\n";
                                    $return_called_overload .= tabs(5) . "references->AddReference(return_value, \"{$class_name_ex}::{$method_name} at call with {$required_parameters} argument(s)\");\n";
                                    $return_called_overload .= tabs(4) . "}\n";
                                }
                                break;
                            case "const_none":
                            case "none":
                                $return_called_overload .= tabs(4) . "#ifdef USE_WXPHP_DEBUG\n";
                                if ($declaration["static"]) {
                                    $return_called_overload .= tabs(4) . "php_printf(\"Static \");\n";
                                }
                                $return_called_overload .= tabs(4) . "php_printf(\"Executing {$class_name_ex}::{$method_name}({$parameters_string}) to return new object\\n\\n\");\n";
                                $return_called_overload .= tabs(4) . "#endif\n\n";
                                $return_called_overload .= tabs(4) . $return_type . " value_to_return{$required_parameters};\n";
                                if ($class_name == null) {
                                    $return_called_overload .= function_return_call($method_name, $parameters_string, $required_parameters, $standard_return_type, $declaration[$function_return_types]);
                                } elseif (!$declaration["static"]) {
                                    $return_called_overload .= class_method_return_call($class_name_ex, $method_name, $parameters_string, $required_parameters, $standard_return_type, $declaration[$function_return_types]);
                                } else {
                                    $return_called_overload .= tabs(4) . "value_to_return{$required_parameters} = {$class_name_ex}::{$method_name}({$parameters_string});\n";
                                    if (inherits_from_class("wxObject", $return_type)) {
                                        $return_called_overload .= tabs(4) . "#if !defined(__WXMSW__) && !defined(__WXMAC__)\n";
                                        $return_called_overload .= tabs(4) . "((wxRefCounter *) value_to_return{$required_parameters}.GetRefData())->IncRef();\n";
                                        $return_called_overload .= tabs(4) . "#endif\n";
                                    }
                                    $return_called_overload .= tabs(4) . "void* ptr = safe_emalloc(1, sizeof({$return_type}_php), 0);\n";
                                    $return_called_overload .= tabs(4) . "memcpy(ptr, (void*) &value_to_return{$required_parameters}, sizeof({$return_type}));\n";
                                    $return_called_overload .= tabs(4) . "object_init_ex(return_value, php_{$return_type}_entry);\n";
                                    $return_called_overload .= tabs(4) . "(({$return_type}_php*)ptr)->phpObj = return_value;\n";
                                    if (class_has_properties($return_type)) {
                                        $return_called_overload .= tabs(4) . "(({$return_type}_php*)ptr)->InitProperties();\n";
                                    }
                                    $return_called_overload .= tabs(4) . "zo_{$return_type}* zo{$required_parameters} = (zo_{$return_type}*) zend_object_store_get_object(return_value TSRMLS_CC);\n";
                                    $return_called_overload .= tabs(4) . "zo{$required_parameters}->native_object = ({$return_type}_php*) ptr;\n";
                                }
                                break;
                        }
                        break;
                }
                $return_called_overload .= "\n" . $after_return_called_overload . "\n";
                $return_called_overload .= tabs(4) . "return;\n";
            } else {
                $return_called_overload .= tabs(4) . "#ifdef USE_WXPHP_DEBUG\n";
                $return_called_overload .= tabs(4) . "php_printf(\"Executing __construct({$parameters_string})\\n\");\n";
                $return_called_overload .= tabs(4) . "#endif\n\n";
                $return_called_overload .= tabs(4) . "native_object = new {$method_name}_php({$parameters_string});\n\n";
                $return_called_overload .= tabs(4) . "native_object->references.Initialize();\n";
                $return_called_overload .= $after_constructor_called;
            }
            $return_called_overload .= tabs(4) . "break;\n";
            $return_called_overload .= tabs(3) . "}\n";
        }
        $return_called_overload .= tabs(2) . "}\n";
        $return_called_overload .= tabs(1) . "}\n";
        $return_called_overload .= "\n\t";
    }
    return $return_called_overload;
}
Beispiel #2
0
     $object_constants .= tabs(2) . "wxPHP_REGISTER_OBJECT_CONSTANT(\"wxTransparentColour\", z_wx_transparent_color, CONST_CS | CONST_PERSISTENT);\n";
     continue;
 }
 //Since wxART_ global variables are defined as wxString but what they are really is a char[]
 if ("" . strpos($variable_name, "wxART_") . "" != "") {
     $classes .= "\tchar _wxchar_{$variable_name}[] = {$variable_name};\n";
     $classes .= "\tREGISTER_STRING_CONSTANT(\"{$variable_name}\", _wxchar_{$variable_name}, CONST_CS | CONST_PERSISTENT);\n";
     continue;
 }
 //To prevent wx/datetime.h(1810): assert "IsValid()" failed in GetTicks(): invalid wxDateTime
 if ($variable_name == "wxDefaultDateTime") {
     $classes .= "\tREGISTER_LONG_CONSTANT(\"{$variable_name}\", time(NULL), CONST_CS | CONST_PERSISTENT);\n";
     continue;
 }
 $type_modifier = "";
 $standard_type = parameter_type($variable_type, false, "Global Variables", null, $type_modifier, true);
 $plain_type = str_replace(array("const ", "&", "*"), "", $variable_type);
 switch ($standard_type) {
     case "bool":
         switch ($type_modifier) {
             case "pointer":
             case "const_pointer":
                 $classes .= "\tREGISTER_LONG_CONSTANT(\"{$variable_name}\", *{$variable_name}, CONST_CS | CONST_PERSISTENT);\n";
                 break;
             case "reference":
             case "const_reference":
             case "none":
             case "const_none":
                 $classes .= "\tREGISTER_LONG_CONSTANT(\"{$variable_name}\", {$variable_name}, CONST_CS | CONST_PERSISTENT);\n";
                 break;
         }
Beispiel #3
0
/**
 * Converts an argument type to an html link only if the type
 * is a wxwidgets class or strips const, reference and pointer
 * operators.
 * 
 * @param $method_type The name of the type to parse
 * 
 * @return html link
 */
function get_method_type_link($type, $type_name, $function_name, $class_name = null)
{
    $declaration_modifier = "";
    $standard_type = parameter_type($type, false, $function_name, $class_name, $declaration_modifier, true);
    $cleaned_type = str_replace(array("const ", "*", "&"), "", $type);
    $type_name = "<span class=\"parameter-name\">\${$type_name}</span>";
    $method_type = "";
    switch ($standard_type) {
        case "bool":
            switch ($declaration_modifier) {
                case "pointer":
                    //bool*
                //bool*
                case "reference":
                    //bool&
                    $method_type = "bool &{$type_name}";
                    break;
                case "const_pointer":
                    //const bool* Array
                    $method_type = "array {$type_name}";
                    break;
                case "const_reference":
                    //const bool&
                //const bool&
                case "none":
                    //bool
                //bool
                case "const_none":
                    //const bool
                    $method_type = "bool {$type_name}";
                    break;
            }
            break;
        case "integer":
            switch ($declaration_modifier) {
                case "pointer":
                    //integer*
                //integer*
                case "reference":
                    //integer&
                    $method_type = "integer &{$type_name}";
                    break;
                case "const_pointer":
                    //const integer* Array
                    $method_type = "array {$type_name}";
                    break;
                case "const_reference":
                    //const integer&
                //const integer&
                case "none":
                    //integer
                //integer
                case "const_none":
                    //const integer
                    $method_type = "integer {$type_name}";
                    break;
            }
            break;
        case "class_enum":
            switch ($declaration_modifier) {
                case "pointer":
                    //integer*
                //integer*
                case "reference":
                    //integer&
                    $method_type = "<a href=\"class_constants.html#{$cleaned_type}\">{$cleaned_type}</a> &{$type_name}";
                    break;
                case "const_pointer":
                    //const integer* Array
                    $method_type = "array {$type_name}";
                    break;
                case "const_reference":
                    //const integer&
                //const integer&
                case "none":
                    //integer
                //integer
                case "const_none":
                    //const integer
                    $method_type = "<a href=\"class_constants.html#{$cleaned_type}\">{$cleaned_type}</a> {$type_name}";
                    break;
            }
            break;
        case "global_enum":
            switch ($declaration_modifier) {
                case "pointer":
                    //integer*
                //integer*
                case "reference":
                    //integer&
                    $method_type = "<a href=\"enum_constants.html#{$cleaned_type}\">{$cleaned_type}</a> &{$type_name}";
                    break;
                case "const_pointer":
                    //const integer* Array
                    $method_type = "array {$type_name}";
                    break;
                case "const_reference":
                    //const integer&
                //const integer&
                case "none":
                    //integer
                //integer
                case "const_none":
                    //const integer
                    $method_type = "<a href=\"enum_constants.html#{$cleaned_type}\">{$cleaned_type}</a> {$type_name}";
                    break;
            }
            break;
        case "float":
            switch ($declaration_modifier) {
                case "pointer":
                    //float*
                //float*
                case "reference":
                    //float&
                    $method_type = "float &{$type_name}";
                    break;
                case "const_pointer":
                    //const float* Array
                    $method_type = "array {$type_name}";
                    break;
                case "const_reference":
                    //const float&
                //const float&
                case "none":
                    //float
                //float
                case "const_none":
                    //const float
                    $method_type = "float {$type_name}";
                    break;
            }
            break;
        case "characters":
            switch ($declaration_modifier) {
                case "pointer":
                    //char*
                //char*
                case "reference":
                    //char&
                    $method_type = "string &{$type_name}";
                    break;
                case "const_pointer":
                    //const char*
                    $method_type = "string {$type_name}";
                    break;
                case "const_reference":
                    //const char&
                //const char&
                case "none":
                    //char
                //char
                case "const_none":
                    //const char
                    $method_type = "string {$type_name}";
                    break;
            }
            break;
        case "void":
            switch ($declaration_modifier) {
                case "const_pointer_pointer":
                    //const void**
                    $method_type = "string {$type_name}";
                    break;
                case "pointer_pointer":
                    $method_type = "string[] &{$type_name}";
                    break;
                case "const_pointer":
                    //const void*
                    $method_type = "string {$type_name}";
                    break;
                case "pointer":
                    //void*
                    $method_type = "string &{$type_name}";
                    break;
            }
            break;
        case "date":
            switch ($declaration_modifier) {
                case "pointer":
                    //long*
                //long*
                case "reference":
                    //long&
                    $method_type = "timestamp &{$type_name}";
                    break;
                case "const_pointer":
                    //const long* Array
                    $method_type = "array {$type_name}";
                    break;
                case "const_reference":
                    //const long&
                //const long&
                case "none":
                    //long
                //long
                case "const_none":
                    //const long
                    $method_type = "timestamp {$type_name}";
                    break;
            }
            break;
        case "string":
            switch ($declaration_modifier) {
                case "pointer":
                    //wxString*
                //wxString*
                case "reference":
                    //wxString&
                    $method_type = "string &{$type_name}";
                    break;
                case "const_pointer":
                    //const wxString* Array
                    $method_type = "array {$type_name}";
                    break;
                case "const_reference":
                    //const wxString&
                //const wxString&
                case "none":
                    //wxString
                //wxString
                case "const_none":
                    //const wxString
                    $method_type = "string {$type_name}";
                    break;
            }
            break;
        case "strings_array":
            switch ($declaration_modifier) {
                case "pointer":
                    //wxArrayString*
                //wxArrayString*
                case "reference":
                    //wxArrayString&
                    $method_type = "array &{$type_name}";
                    break;
                case "const_pointer":
                    //const wxArrayString* Array
                    $method_type = "array {$type_name}";
                    break;
                case "const_reference":
                    //const wxArrayString&
                //const wxArrayString&
                case "none":
                    //wxArrayString
                //wxArrayString
                case "const_none":
                    //const wxArrayString
                    $method_type = "array {$type_name}";
                    break;
            }
            break;
        case "object":
            switch ($declaration_modifier) {
                case "pointer":
                    //object*
                //object*
                case "reference":
                    //object&
                    $method_type = "<a href=\"{$cleaned_type}.html\">{$cleaned_type}</a> &{$type_name}";
                    break;
                case "const_pointer":
                    //const bool* Array
                //const bool* Array
                case "const_reference":
                    //const bool&
                //const bool&
                case "none":
                    //bool
                //bool
                case "const_none":
                    //const bool
                    $method_type = "<a href=\"{$cleaned_type}.html\">{$cleaned_type}</a> {$type_name}";
                    break;
            }
            break;
        default:
    }
    return $method_type;
}
/**
 * @author Jefferson González
 *
 * @license
 * This file is part of wxPHP check the LICENSE file for information.
 *
 * @description
 * Functions to assist on the generation of the wxWidgets functions
 * to php functions code
 *
*/
function classes_get_property_code($class_name)
{
    global $defClassProperties;
    $code = "";
    if (isset($defClassProperties[$class_name])) {
        $property_index = 0;
        foreach ($defClassProperties[$class_name] as $property_name => $property_attributes) {
            $type_modifier = "";
            $standard_type = parameter_type($property_attributes["type"], false, "MINIT", $class_name, $type_modifier, true);
            $property_type = str_replace(array("const ", "&", "*"), "", $property_attributes["type"]);
            switch ($type_modifier) {
                //If constant skip
                case "const_pointer":
                case "const_pointer_pointer":
                case "const_reference":
                case "const_none":
                    continue;
                default:
                    //If not constant continue
                    break;
            }
            if (!$property_attributes["static"]) {
                $code .= "else if(strcmp(\"{$property_name}\", name) == 0)\n";
                $code .= tabs(1) . "{\n";
            } else {
                //Skip static properties (we should handle them differently?)
                continue;
            }
            switch ($standard_type) {
                case "bool":
                    switch ($type_modifier) {
                        case "pointer":
                        case "pointer_pointer":
                            $code .= tabs(2) . "RETVAL_BOOL(*((bool*) *((void**) native_object->properties[{$property_index}])));\n";
                            break;
                        case "reference":
                        case "none":
                            $code .= tabs(2) . "RETVAL_BOOL(*((bool*) native_object->properties[{$property_index}]));\n";
                            break;
                    }
                    break;
                case "integer":
                case "class_enum":
                case "global_enum":
                    switch ($type_modifier) {
                        case "pointer":
                        case "pointer_pointer":
                            $code .= tabs(2) . "RETVAL_LONG(*(({$property_type}*) *((void**) native_object->properties[{$property_index}])));\n";
                            break;
                        case "reference":
                        case "none":
                            $code .= tabs(2) . "RETVAL_LONG(*(({$property_type}*) native_object->properties[{$property_index}]));\n";
                            break;
                    }
                    break;
                case "float":
                    switch ($type_modifier) {
                        case "pointer":
                        case "pointer_pointer":
                            $code .= tabs(2) . "RETVAL_DOUBLE(*(({$property_type}*) *((void**) native_object->properties[{$property_index}])));\n";
                            break;
                        case "reference":
                        case "none":
                            $code .= tabs(2) . "RETVAL_DOUBLE(*(({$property_type}*) native_object->properties[{$property_index}]));\n";
                            break;
                    }
                    break;
                case "characters":
                    switch ($type_modifier) {
                        case "pointer":
                        case "pointer_pointer":
                            $code .= tabs(2) . "RETVAL_STRING(((char*) *((void**) native_object->properties[{$property_index}])), 1);\n";
                            break;
                        case "reference":
                        case "none":
                            $code .= tabs(2) . "RETVAL_LONG(*((char*) native_object->properties[{$property_index}]));\n";
                            break;
                    }
                    break;
                case "date":
                    switch ($type_modifier) {
                        case "pointer":
                        case "pointer_pointer":
                            $code .= tabs(2) . "RETVAL_LONG(*((wxDateTime*) *((void**) native_object->properties[{$property_index}])).GetTicks());\n";
                            break;
                        case "reference":
                        case "none":
                            $code .= tabs(2) . "RETVAL_LONG(*((wxDateTime*) native_object->properties[{$property_index}]).GetTicks());\n";
                            break;
                    }
                    break;
                case "string":
                    switch ($type_modifier) {
                        case "pointer":
                        case "pointer_pointer":
                            $code .= tabs(2) . "RETVAL_STRING(*((wxString*) *((void**) native_object->properties[{$property_index}])).char_str(), 1);\n";
                            break;
                        case "reference":
                        case "none":
                            $code .= tabs(2) . "RETVAL_STRING((const char*) *((wxString*) native_object->properties[{$property_index}])->char_str(), 1);\n";
                            break;
                    }
                    break;
                case "object":
                    switch ($type_modifier) {
                        case "pointer":
                        case "pointer_pointer":
                            $code .= tabs(2) . "object_init_ex(return_value, php_{$property_type}_entry);\n";
                            $code .= tabs(2) . "((zo_{$class_name}*) zend_object_store_get_object(return_value TSRMLS_CC))->native_object = (({$property_type}_php*) *((void**) native_object->properties[{$property_index}]));\n";
                            $code .= tabs(2) . "return;\n";
                            break;
                        case "reference":
                        case "none":
                            $code .= tabs(2) . "object_init_ex(return_value, php_{$property_type}_entry);\n";
                            $code .= tabs(2) . "((zo_{$class_name}*) zend_object_store_get_object(return_value TSRMLS_CC))->native_object = (({$property_type}_php*) native_object->properties[{$property_index}]);\n";
                            $code .= tabs(2) . "return;\n";
                            break;
                    }
                    break;
                default:
                    //Just skip unknown types
            }
            $code .= tabs(1) . "}\n";
            $code .= tabs(1);
            $property_index++;
        }
    }
    $code = rtrim($code, "\t");
    return $code;
}
/**
 * Generates the code that calls a user space virtual method and returns the data
 *
 * @param array $method_definitions Data for the method.
 * @param string $method_name Name of the method.
 * @param string $class_name Name of the method parent class.
 * 
 * @return string Generated code ready to insert on the end of 
 * the virtual method body.
 */
function class_virtual_method_return($method_definition, $method_name, $class_name)
{
    //Positions on the array of $method_definition where type and parameters data is stored
    $function_return_types = "return_type";
    $output = "";
    $return_type_modifier = "";
    $standard_parameter_type = parameter_type($method_definition[$function_return_types], false, $method_name, $class_name, $return_type_modifier);
    $return_type = str_replace(array("const ", "&", "*"), "", $method_definition[$function_return_types]);
    switch ($standard_parameter_type) {
        case "bool":
            $output = "return Z_BVAL_P(return_value);\n";
            break;
        case "integer":
        case "class_enum":
        case "global_enum":
            $output .= "return ({$return_type}) Z_LVAL_P(return_value);\n";
            break;
        case "float":
            $output .= "return Z_DVAL_P(return_value);\n";
            break;
        case "characters":
            $output .= "return Z_STRVAL_P(return_value);\n";
            break;
        case "void":
            switch ($return_type_modifier) {
                case "const_pointer":
                case "pointer":
                    $output .= "return (void*) Z_STRVAL_P(return_value);\n";
                    break;
                default:
                    $output .= "return;\n";
                    break;
            }
            break;
        case "date":
            $output .= "return wxDateTime(Z_LVAL_P(return_value));\n";
            break;
        case "string":
            $output .= "return wxString(Z_STRVAL_P(return_value), wxConvUTF8);\n";
            break;
            /*case "strings_array":
            		
            		break;*/
        /*case "strings_array":
        		
        		break;*/
        case "object":
            $output .= "if(Z_TYPE_P(return_value) == IS_OBJECT)\n";
            $output .= tabs(1) . "{\n";
            $output .= tabs(2) . "return_object = (void*) ((zo_{$return_type}*) zend_object_store_get_object(return_value TSRMLS_CC))->native_object;\n";
            $output .= tabs(1) . "}\n\n";
            $output .= tabs(1) . "//Threat it as a normal object on the calling function and not a php user space intiialized one\n";
            $output .= tabs(1) . "((zo_{$return_type}*) zend_object_store_get_object(return_value TSRMLS_CC))->is_user_initialized = 0;\n";
            $output .= tabs(1) . "{$return_type}_php* var = ({$return_type}_php*) return_object;\n";
            $output .= tabs(1) . "var->references.UnInitialize();\n\n";
            switch ($return_type_modifier) {
                case "const_pointer":
                case "pointer":
                    $output .= tabs(1) . "return (" . $method_definition[$function_return_types] . ") return_object;\n";
                    break;
                case "const_reference":
                case "reference":
                case "const_none":
                case "none":
                    $output .= tabs(1) . "return *(" . $return_type . "*) return_object;\n";
            }
            break;
    }
    return $output;
}
Beispiel #6
0
function get_argument_declaration($type, $type_name, $function_name, $class_name = null)
{
    $declaration_modifier = "";
    $standard_type = parameter_type($type, false, $function_name, $class_name, $declaration_modifier, true);
    $cleaned_type = str_replace(array("const ", "*", "&"), "", $type);
    $method_type = "";
    switch ($standard_type) {
        case "bool":
            switch ($declaration_modifier) {
                case "pointer":
                    //bool*
                //bool*
                case "reference":
                    //bool&
                    $method_type = "&\${$type_name}";
                    break;
                case "const_pointer":
                    //const bool* Array
                    $method_type = "array \${$type_name}";
                    break;
                case "const_reference":
                    //const bool&
                //const bool&
                case "none":
                    //bool
                //bool
                case "const_none":
                    //const bool
                    $method_type = "\${$type_name}";
                    break;
            }
            break;
        case "integer":
            switch ($declaration_modifier) {
                case "pointer":
                    //integer*
                //integer*
                case "reference":
                    //integer&
                    $method_type = "&\${$type_name}";
                    break;
                case "const_pointer":
                    //const integer* Array
                    $method_type = "array \${$type_name}";
                    break;
                case "const_reference":
                    //const integer&
                //const integer&
                case "none":
                    //integer
                //integer
                case "const_none":
                    //const integer
                    $method_type = "\${$type_name}";
                    break;
            }
            break;
        case "class_enum":
            switch ($declaration_modifier) {
                case "pointer":
                    //integer*
                //integer*
                case "reference":
                    //integer&
                    $method_type = "&\${$type_name}";
                    break;
                case "const_pointer":
                    //const integer* Array
                    $method_type = "array \${$type_name}";
                    break;
                case "const_reference":
                    //const integer&
                //const integer&
                case "none":
                    //integer
                //integer
                case "const_none":
                    //const integer
                    $method_type = "\${$type_name}";
                    break;
            }
            break;
        case "global_enum":
            switch ($declaration_modifier) {
                case "pointer":
                    //integer*
                //integer*
                case "reference":
                    //integer&
                    $method_type = "{$cleaned_type} &\${$type_name}";
                    break;
                case "const_pointer":
                    //const integer* Array
                    $method_type = "array \${$type_name}";
                    break;
                case "const_reference":
                    //const integer&
                //const integer&
                case "none":
                    //integer
                //integer
                case "const_none":
                    //const integer
                    $method_type = "{$cleaned_type} \${$type_name}";
                    break;
            }
            break;
        case "float":
            switch ($declaration_modifier) {
                case "pointer":
                    //float*
                //float*
                case "reference":
                    //float&
                    $method_type = "&\${$type_name}";
                    break;
                case "const_pointer":
                    //const float* Array
                    $method_type = "array \${$type_name}";
                    break;
                case "const_reference":
                    //const float&
                //const float&
                case "none":
                    //float
                //float
                case "const_none":
                    //const float
                    $method_type = "\${$type_name}";
                    break;
            }
            break;
        case "characters":
            switch ($declaration_modifier) {
                case "pointer":
                    //char*
                //char*
                case "reference":
                    //char&
                    $method_type = "&\${$type_name}";
                    break;
                case "const_pointer":
                    //const char*
                    $method_type = "\${$type_name}";
                    break;
                case "const_reference":
                    //const char&
                //const char&
                case "none":
                    //char
                //char
                case "const_none":
                    //const char
                    $method_type = "\${$type_name}";
                    break;
            }
            break;
        case "void":
            switch ($declaration_modifier) {
                case "const_pointer_pointer":
                    //const void**
                //const void**
                case "pointer_pointer":
                case "const_pointer":
                    //const void*
                //const void*
                case "pointer":
                    //void*
                    $method_type = "\${$type_name}";
                    break;
            }
            break;
        case "date":
            switch ($declaration_modifier) {
                case "pointer":
                    //long*
                //long*
                case "reference":
                    //long&
                    $method_type = "&\${$type_name}";
                    break;
                case "const_pointer":
                    //const long* Array
                    $method_type = "array \${$type_name}";
                    break;
                case "const_reference":
                    //const long&
                //const long&
                case "none":
                    //long
                //long
                case "const_none":
                    //const long
                    $method_type = "\${$type_name}";
                    break;
            }
            break;
        case "string":
            switch ($declaration_modifier) {
                case "pointer":
                    //wxString*
                //wxString*
                case "reference":
                    //wxString&
                    $method_type = "&\${$type_name}";
                    break;
                case "const_pointer":
                    //const wxString* Array
                    $method_type = "array \${$type_name}";
                    break;
                case "const_reference":
                    //const wxString&
                //const wxString&
                case "none":
                    //wxString
                //wxString
                case "const_none":
                    //const wxString
                    $method_type = "\${$type_name}";
                    break;
            }
            break;
        case "strings_array":
            switch ($declaration_modifier) {
                case "pointer":
                    //wxArrayString*
                //wxArrayString*
                case "reference":
                    //wxArrayString&
                    $method_type = "array &\${$type_name}";
                    break;
                case "const_pointer":
                    //const wxArrayString* Array
                    $method_type = "array \${$type_name}";
                    break;
                case "const_reference":
                    //const wxArrayString&
                //const wxArrayString&
                case "none":
                    //wxArrayString
                //wxArrayString
                case "const_none":
                    //const wxArrayString
                    $method_type = "array \${$type_name}";
                    break;
            }
            break;
        case "object":
            switch ($declaration_modifier) {
                case "pointer":
                    //object*
                //object*
                case "reference":
                    //object&
                    $method_type = "{$cleaned_type} &\${$type_name}";
                    break;
                case "const_pointer":
                    //const bool* Array
                //const bool* Array
                case "const_reference":
                    //const bool&
                //const bool&
                case "none":
                    //bool
                //bool
                case "const_none":
                    //const bool
                    $method_type = "{$cleaned_type} \${$type_name}";
                    break;
            }
            break;
        default:
    }
    return $method_type;
}
function register_class_const_properties($class_name)
{
    global $defClassProperties;
    $code = "";
    if (isset($defClassProperties[$class_name])) {
        foreach ($defClassProperties[$class_name] as $property_name => $property_attributes) {
            $type_modifier = "";
            $standard_type = parameter_type($property_attributes["type"], false, "MINIT", $class_name, $type_modifier, true);
            $property_type = str_replace(array("const ", "&", "*"), "", $property_attributes["type"]);
            switch ($type_modifier) {
                case "const_pointer":
                case "const_pointer_pointer":
                case "const_reference":
                case "const_none":
                    break;
                default:
                    //If not constant skip
                    continue;
            }
            switch ($standard_type) {
                case "bool":
                    switch ($type_modifier) {
                        case "const_pointer":
                        case "const_pointer_pointer":
                            $code .= "\tzend_declare_class_constant_bool(php_{$class_name}_entry, \"{$property_name}\", " . strlen($property_name) . ", *{$property_name} TSRMLS_CC);\n";
                            break;
                        case "const_reference":
                        case "const_none":
                            $code .= "\tzend_declare_class_constant_bool(php_{$class_name}_entry, \"{$property_name}\", " . strlen($property_name) . ", {$property_name} TSRMLS_CC);\n";
                            break;
                    }
                    break;
                case "integer":
                case "class_enum":
                case "global_enum":
                    switch ($type_modifier) {
                        case "const_pointer":
                        case "const_pointer_pointer":
                            $code .= "\tzend_declare_class_constant_long(php_{$class_name}_entry, \"{$property_name}\", " . strlen($property_name) . ", *{$property_name} TSRMLS_CC);\n";
                            break;
                        case "const_reference":
                        case "const_none":
                            $code .= "\tzend_declare_class_constant_long(php_{$class_name}_entry, \"{$property_name}\", " . strlen($property_name) . ", {$property_name} TSRMLS_CC);\n";
                            break;
                    }
                    break;
                case "float":
                    switch ($type_modifier) {
                        case "const_pointer":
                        case "const_pointer_pointer":
                            $code .= "\tzend_declare_class_constant_double(php_{$class_name}_entry, \"{$property_name}\", " . strlen($property_name) . ", *{$property_name} TSRMLS_CC);\n";
                            break;
                        case "const_reference":
                        case "const_none":
                            $code .= "\tzend_declare_class_constant_double(php_{$class_name}_entry, \"{$property_name}\", " . strlen($property_name) . ", {$property_name} TSRMLS_CC);\n";
                            break;
                    }
                    break;
                case "characters":
                    switch ($type_modifier) {
                        case "const_pointer":
                        case "const_pointer_pointer":
                            $code .= "\tzend_declare_class_constant_string(php_{$class_name}_entry, \"{$property_name}\", " . strlen($property_name) . ", {$property_name} TSRMLS_CC);\n";
                            break;
                        case "const_reference":
                        case "const_none":
                            $code .= "\tzend_declare_class_constant_long(php_{$class_name}_entry, \"{$property_name}\", " . strlen($property_name) . ", {$property_name} TSRMLS_CC);\n";
                            break;
                    }
                    break;
                case "date":
                    switch ($type_modifier) {
                        case "const_pointer":
                        case "const_pointer_pointer":
                            $code .= "\tzend_declare_class_constant_bool(php_{$class_name}_entry, \"{$property_name}\", " . strlen($property_name) . ", {$property_name->GetTicks}() TSRMLS_CC);\n";
                            break;
                        case "const_reference":
                        case "const_none":
                            $code .= "\tzend_declare_class_constant_bool(php_{$class_name}_entry, \"{$property_name}\", " . strlen($property_name) . ", {$property_name}.GetTicks() TSRMLS_CC);\n";
                            break;
                    }
                    break;
                case "string":
                    switch ($type_modifier) {
                        case "const_pointer":
                        case "const_pointer_pointer":
                            $code .= "\tzend_declare_class_constant_stringl(php_{$class_name}_entry, \"{$property_name}\", " . strlen($property_name) . ", {$property_name->char_str}(), {$property_name->size}() TSRMLS_CC);\n";
                            break;
                        case "const_reference":
                        case "const_none":
                            $code .= "\tzend_declare_class_constant_stringl(php_{$class_name}_entry, \"{$property_name}\", " . strlen($property_name) . ", {$property_name}.char_str(), {$property_name}.size() TSRMLS_CC);\n";
                            break;
                    }
                    break;
                case "object":
                    switch ($type_modifier) {
                        case "const_pointer":
                        case "const_pointer_pointer":
                            $code .= "\tzval* {$property_name}_zval;\n";
                            $code .= "\tMAKE_STD_ZVAL({$property_name}_zval)\n";
                            $code .= "\tobject_init_ex({$property_name}_zval, php_{$property_type}_entry);\n";
                            $code .= "\t((zo_{$property_type}*) zend_object_store_get_object({$property_name}_zval TSRMLS_CC))->native_object = ({$property_type}_php*) {$property_name};\n";
                            $code .= "\tzend_declare_class_constant(php_{$class_name}_entry, \"{$property_name}\", " . strlen($property_name) . ", {$property_name}_zval TSRMLS_CC);\n";
                            break;
                        case "const_reference":
                        case "const_none":
                            $code .= "\tzval* {$property_name}_zval;\n";
                            $code .= "\tMAKE_STD_ZVAL({$property_name}_zval)\n";
                            $code .= "\tobject_init_ex({$property_name}_zval, php_{$property_type}_entry);\n";
                            $code .= "\t((zo_{$property_type}*) zend_object_store_get_object({$property_name}_zval TSRMLS_CC))->native_object = ({$property_type}_php*) &{$property_name};\n";
                            $code .= "\tzend_declare_class_constant(php_{$class_name}_entry, \"{$property_name}\", " . strlen($property_name) . ", {$property_name}_zval TSRMLS_CC);\n";
                            break;
                    }
                    break;
                default:
                    //Just skip unknown types
            }
        }
    }
    return $code;
}