/* {{{ proto Exception|Error::__construct(string message, int code [, Throwable previous]) Exception constructor */ ZEND_METHOD(exception, __construct) { zend_string *message = NULL; zend_long code = 0; zval *object, *previous = NULL; zend_class_entry *base_ce; int argc = ZEND_NUM_ARGS(); object = getThis(); base_ce = i_get_exception_base(object); if (zend_parse_parameters_ex(ZEND_PARSE_PARAMS_QUIET, argc, "|SlO!", &message, &code, &previous, zend_ce_throwable) == FAILURE) { zend_class_entry *ce; if (execute_data->called_scope) { ce = execute_data->called_scope; } else { ce = base_ce; } zend_throw_error(NULL, "Wrong parameters for %s([string $message [, long $code [, Throwable $previous = NULL]]])", ZSTR_VAL(ce->name)); return; } if (message) { zend_update_property_str(base_ce, object, "message", sizeof("message")-1, message); } if (code) { zend_update_property_long(base_ce, object, "code", sizeof("code")-1, code); } if (previous) { zend_update_property(base_ce, object, "previous", sizeof("previous")-1, previous); } }
static zend_object *zend_default_exception_new_ex(zend_class_entry *class_type, int skip_top_traces) /* {{{ */ { zval obj; zend_object *object; zval trace; zend_class_entry *base_ce; zend_string *filename; Z_OBJ(obj) = object = zend_objects_new(class_type); Z_OBJ_HT(obj) = &default_exception_handlers; object_properties_init(object, class_type); if (EG(current_execute_data)) { zend_fetch_debug_backtrace(&trace, skip_top_traces, 0, 0); } else { array_init(&trace); } Z_SET_REFCOUNT(trace, 0); base_ce = i_get_exception_base(&obj); if (EXPECTED(class_type != zend_ce_parse_error || !(filename = zend_get_compiled_filename()))) { zend_update_property_string(base_ce, &obj, "file", sizeof("file")-1, zend_get_executed_filename()); zend_update_property_long(base_ce, &obj, "line", sizeof("line")-1, zend_get_executed_lineno()); } else { zend_update_property_str(base_ce, &obj, "file", sizeof("file")-1, filename); zend_update_property_long(base_ce, &obj, "line", sizeof("line")-1, zend_get_compiled_lineno()); } zend_update_property(base_ce, &obj, "trace", sizeof("trace")-1, &trace); return object; }
yaf_dispatcher_t *yaf_dispatcher_instance(yaf_dispatcher_t *this_ptr) /* {{{ */ { zval plugins; yaf_router_t *router, rv = {{0}}; yaf_dispatcher_t *instance; instance = zend_read_static_property(yaf_dispatcher_ce, ZEND_STRL(YAF_DISPATCHER_PROPERTY_NAME_INSTANCE), 1); if (IS_OBJECT == Z_TYPE_P(instance) && instanceof_function(Z_OBJCE_P(instance), yaf_dispatcher_ce)) { return instance; } if (Z_ISUNDEF_P(this_ptr)) { object_init_ex(this_ptr, yaf_dispatcher_ce); } else { return this_ptr; } array_init(&plugins); zend_update_property(yaf_dispatcher_ce, this_ptr, ZEND_STRL(YAF_DISPATCHER_PROPERTY_NAME_PLUGINS), &plugins); zval_ptr_dtor(&plugins); router = yaf_router_instance(&rv); zend_update_property(yaf_dispatcher_ce, this_ptr, ZEND_STRL(YAF_DISPATCHER_PROPERTY_NAME_ROUTER), router); zval_ptr_dtor(router); zend_update_property_str(yaf_dispatcher_ce, this_ptr, ZEND_STRL(YAF_DISPATCHER_PROPERTY_NAME_MODULE), YAF_G(default_module)); zend_update_property_str(yaf_dispatcher_ce, this_ptr, ZEND_STRL(YAF_DISPATCHER_PROPERTY_NAME_CONTROLLER), YAF_G(default_controller)); zend_update_property_str(yaf_dispatcher_ce, this_ptr, ZEND_STRL(YAF_DISPATCHER_PROPERTY_NAME_ACTION), YAF_G(default_action)); zend_update_static_property(yaf_dispatcher_ce, ZEND_STRL(YAF_DISPATCHER_PROPERTY_NAME_INSTANCE), this_ptr); return this_ptr; }
yaf_route_t * yaf_route_map_instance(yaf_route_t *this_ptr, zend_bool controller_prefer, zend_string *delim) /* {{{ */{ if (Z_ISUNDEF_P(this_ptr)) { object_init_ex(this_ptr, yaf_route_map_ce); } if (controller_prefer) { zend_update_property_bool(yaf_route_map_ce, this_ptr, ZEND_STRL(YAF_ROUTE_MAP_VAR_NAME_CTL_PREFER), 1); } if (delim && ZSTR_LEN(delim)) { zend_update_property_str(yaf_route_map_ce, this_ptr, ZEND_STRL(YAF_ROUTE_MAP_VAR_NAME_DELIMETER), delim); } return this_ptr; }
/** {{{ int yaf_route_map_route(yaf_route_t *route, yaf_request_t *request) */ int yaf_route_map_route(yaf_route_t *route, yaf_request_t *request) { zval *ctl_prefer, *delimer, *zuri, *base_uri, params; char *req_uri, *tmp, *rest, *ptrptr, *seg; char *query_str = NULL; uint seg_len = 0; smart_str route_result = {0}; zuri = zend_read_property(yaf_request_ce, request, ZEND_STRL(YAF_REQUEST_PROPERTY_NAME_URI), 1, NULL); base_uri = zend_read_property(yaf_request_ce, request, ZEND_STRL(YAF_REQUEST_PROPERTY_NAME_BASE), 1, NULL); ctl_prefer = zend_read_property(yaf_route_map_ce, route, ZEND_STRL(YAF_ROUTE_MAP_VAR_NAME_CTL_PREFER), 1, NULL); delimer = zend_read_property(yaf_route_map_ce, route, ZEND_STRL(YAF_ROUTE_MAP_VAR_NAME_DELIMETER), 1, NULL); if (base_uri && IS_STRING == Z_TYPE_P(base_uri) && !strncasecmp(Z_STRVAL_P(zuri), Z_STRVAL_P(base_uri), Z_STRLEN_P(base_uri))) { req_uri = estrdup(Z_STRVAL_P(zuri) + Z_STRLEN_P(base_uri)); } else { req_uri = estrdup(Z_STRVAL_P(zuri)); } if (Z_TYPE_P(delimer) == IS_STRING && Z_STRLEN_P(delimer)) { if ((query_str = strstr(req_uri, Z_STRVAL_P(delimer))) != NULL && *(query_str - 1) == '/') { tmp = req_uri; rest = query_str + Z_STRLEN_P(delimer); if (*rest == '\0') { req_uri = estrndup(req_uri, query_str - req_uri); query_str = NULL; efree(tmp); } else if (*rest == '/') { req_uri = estrndup(req_uri, query_str - req_uri); query_str = estrdup(rest); efree(tmp); } else { query_str = NULL; } } else { query_str = NULL; } } seg = php_strtok_r(req_uri, YAF_ROUTER_URL_DELIMIETER, &ptrptr); while (seg) { seg_len = strlen(seg); if (seg_len) { smart_str_appendl(&route_result, seg, seg_len); } smart_str_appendc(&route_result, '_'); seg = php_strtok_r(NULL, YAF_ROUTER_URL_DELIMIETER, &ptrptr); } if (route_result.s) { ZSTR_LEN(route_result.s)--; ZSTR_VAL(route_result.s)[ZSTR_LEN(route_result.s)] = '\0'; if (Z_TYPE_P(ctl_prefer) == IS_TRUE) { zend_update_property_str(yaf_request_ce, request, ZEND_STRL(YAF_REQUEST_PROPERTY_NAME_CONTROLLER), route_result.s); } else { zend_update_property_str(yaf_request_ce, request, ZEND_STRL(YAF_REQUEST_PROPERTY_NAME_ACTION), route_result.s); } smart_str_free(&route_result); } if (query_str) { (void)yaf_router_parse_parameters(query_str, ¶ms); (void)yaf_request_set_params_multi(request, ¶ms); zval_ptr_dtor(¶ms); efree(query_str); } efree(req_uri); return 1; }