zval *object;
zval *item;
zval *arguments;
+ zval *ret;
char *type = NULL;
int type_len = 0;
zend_bool isDefinedTest = 0;
return false;
}
*/
+
if (!Z_TYPE_P(object) == IS_OBJECT) {
if (isDefinedTest) {
RETURN_FALSE;
}
*/
if (strcmp("method", type) != 0) {
- zval *tmp_self_cache, *tmp_class, *tmp_properties, *tmp_item, *tmp_object_item;
+ zval *tmp_class, *tmp_properties, *tmp_item, *tmp_object_item = NULL;
- tmp_self_cache = TWIG_GET_STATIC_PROPERTY(template, "cache");
tmp_class = TWIG_GET_ARRAY_ELEMENT(tmp_self_cache, class_name);
tmp_properties = TWIG_GET_ARRAY_ELEMENT(tmp_class, "properties");
tmp_item = TWIG_GET_ARRAY_ELEMENT_ZVAL(tmp_properties, item);
- convert_to_string(tmp_item);
- tmp_object_item = TWIG_PROPERTY(object, Z_STRVAL_P(tmp_item));
+ if (tmp_item) {
+ convert_to_string(tmp_item);
+ tmp_object_item = TWIG_PROPERTY(object, Z_STRVAL_P(tmp_item));
+ }
if (tmp_item || tmp_object_item || TWIG_ARRAY_KEY_EXISTS(object, item) // FIXME: Array key? is that array access here?
) {
} elseif (isset(self::$cache[$class]['methods']['__call'])) {
$method = $item;
*/
- char *lsItem = TWIG_STRTOLOWER(item);
- char *method = NULL;
- char *tmp_method_name_get = emalloc(4 + strlen(lsItem));
- char *tmp_method_name_is = emalloc(3 + strlen(lsItem));
-
- sprintf(tmp_method_name_get, "get%s", lsItem);
- sprintf(tmp_method_name_is, "is%s", lsItem);
- efree(lsItem);
-
- zval *cache = TWIG_PROPERTY(template, "cache");
- zval *class = TWIG_PROPERTY(cache, "class");
- zval *methods = TWIG_PROPERTY(class, "methods");
-
- if (TWIG_PROPERTY(methods, "lcItem")) {
- method = Z_STRVAL_P(item);
- } else if (TWIG_PROPERTY(methods, tmp_method_name_get)) {
- method = tmp_method_name_get;
- } else if (TWIG_PROPERTY(methods, tmp_method_name_is)) {
- method = tmp_method_name_is;
- } else if (TWIG_PROPERTY(methods, "__call")) {
- method = Z_STRVAL_P(item);
+ {
+ char *lcItem = TWIG_STRTOLOWER_ZVAL(item);
+ char *method = NULL;
+ char *tmp_method_name_get = emalloc(4 + strlen(lcItem));
+ char *tmp_method_name_is = emalloc(3 + strlen(lcItem));
+ zval *tmp_class, *tmp_methods;
+
+ sprintf(tmp_method_name_get, "get%s", lcItem);
+ sprintf(tmp_method_name_is, "is%s", lcItem);
+
+ tmp_class = TWIG_GET_ARRAY_ELEMENT(tmp_self_cache, class_name);
+ tmp_methods = TWIG_GET_ARRAY_ELEMENT(tmp_class, "methods");
+
+ if (TWIG_PROPERTY(tmp_methods, lcItem)) {
+ method = Z_STRVAL_P(item);
+ } else if (TWIG_PROPERTY(tmp_methods, tmp_method_name_get)) {
+ method = tmp_method_name_get;
+ } else if (TWIG_PROPERTY(tmp_methods, tmp_method_name_is)) {
+ method = tmp_method_name_is;
+ } else if (TWIG_PROPERTY(tmp_methods, "__call")) {
+ method = Z_STRVAL_P(item);
/*
} else {
if ($isDefinedTest) {
return true;
}
*/
- } else {
+ } else {
+ if (isDefinedTest) {
+ RETURN_FALSE;
+ }
+ zval *env = TWIG_PROPERTY(template, "env");
+ if (TWIG_CALL_B_0(env, "isStrictVariables")) {
+ return;
+ }
+ TWIG_THROW_EXCEPTION("Twig_Error_Runtime", "Method \"%s\" for object \"%s\" does not exist", item, TWIG_GET_CLASS(object));
+ }
if (isDefinedTest) {
+ efree(tmp_method_name_get);
+ efree(tmp_method_name_is);
+ efree(lcItem);
RETURN_FALSE;
}
- zval *env = TWIG_PROPERTY(template, "env");
- if (TWIG_CALL_B_0(env, "isStrictVariables")) {
- return;
- }
- TWIG_THROW_EXCEPTION("Twig_Error_Runtime", "Method \"%s\" for object \"%s\" does not exist", item, TWIG_GET_CLASS(object));
- }
- if (isDefinedTest) {
- efree(tmp_method_name_get);
- efree(tmp_method_name_is);
- RETURN_FALSE;
- }
/*
if ($this->env->hasExtension('sandbox')) {
$this->env->getExtension('sandbox')->checkMethodAllowed($object, $method);
}
*/
- if (TWIG_CALL_S(TWIG_PROPERTY(template, "env"), "hasExtension", "sandbox")) {
- TWIG_CALL_ZZ(TWIG_CALL_S(TWIG_PROPERTY(template, "env"), "getExtension", "sandbox"), "checkMethodAllowed", object, item);
- }
+ if (TWIG_CALL_S(TWIG_PROPERTY(template, "env"), "hasExtension", "sandbox")) {
+ TWIG_CALL_ZZ(TWIG_CALL_S(TWIG_PROPERTY(template, "env"), "getExtension", "sandbox"), "checkMethodAllowed", object, item);
+ }
/*
$ret = call_user_func_array(array($object, $method), $arguments);
*/
- zval *ret = TWIG_CALL_USER_FUNC_ARRAY(object, method, arguments);
- efree(tmp_method_name_get);
- efree(tmp_method_name_is);
+ ret = TWIG_CALL_USER_FUNC_ARRAY(object, method, arguments);
+ efree(tmp_method_name_get);
+ efree(tmp_method_name_is);
+ efree(lcItem);
+ }
/*
if ($object instanceof Twig_TemplateInterface) {
return new Twig_Markup($ret);
/*
return $ret;
*/
- return_value = ret; // FIXME also wrong
+ if (ret) {
+ RETVAL_ZVAL(ret, 0, 1);
+ }
}