flush
authorMichael Wallner <mike@php.net>
Thu, 22 Oct 2015 08:35:14 +0000 (10:35 +0200)
committerMichael Wallner <mike@php.net>
Thu, 22 Oct 2015 08:35:17 +0000 (10:35 +0200)
php_psi.h
src/module.c
src/parser.h
src/parser.re
src/parser_proc.y

index 29ecd283c102f8f183805ce3f6bc103f97908d45..3e582d0036b7d50cc1db35766004ff7aeff74264 100644 (file)
--- a/php_psi.h
+++ b/php_psi.h
@@ -27,6 +27,7 @@ int psi_internal_type(impl_type *type);
 zend_internal_arg_info *psi_internal_arginfo(impl *impl);
 size_t psi_num_min_args(impl *impl);
 void psi_to_int(impl_val *ret_val, decl_arg *func, zval *return_value);
+void psi_to_double(impl_val *ret_val, decl_arg *func, zval *return_value);
 void psi_to_string(impl_val *ret_val, decl_arg *func, zval *return_value);
 ZEND_RESULT_CODE psi_parse_args(zend_execute_data *execute_data, impl *impl);
 impl_val *psi_do_let(decl_arg *darg);
index 166596434ae8a4447bcebcf362c8e5d5b85751e8..57fe9d6b286ebef8b018cf4506484d7f6f219847 100644 (file)
@@ -107,6 +107,11 @@ void psi_to_int(impl_val *ret_val, decl_arg *func, zval *return_value)
        }
 }
 
+void psi_to_double(impl_val *ret_val, decl_arg *func, zval *return_value)
+{
+       RETVAL_DOUBLE(deref_impl_val(0, ret_val, func)->dval);
+}
+
 void psi_to_string(impl_val *ret_val, decl_arg *func, zval *return_value)
 {
        switch (real_decl_type(func->type)->type) {
index 9709a1d81ee854f4f072f8fd767d4ebbde5ba325..ff0d4d6f1d1596d48c14c7a5a9622ce42291008a 100644 (file)
@@ -92,13 +92,15 @@ static void free_decl_typedefs(decl_typedefs *defs) {
 typedef struct decl_var {
        char *name;
        unsigned pointer_level;
+       unsigned array_size;
        struct decl_arg *arg;
 } decl_var;
 
-static inline decl_var *init_decl_var(char *name, unsigned pl) {
+static inline decl_var *init_decl_var(char *name, unsigned pl, unsigned as) {
        decl_var *v = malloc(sizeof(*v));
        v->name = (char *) strdup((const char *) name);
        v->pointer_level = pl;
+       v->array_size = as;
        return v;
 }
 
index 0d13d79697cb334d108ee9f2423da6896a42eadb..1e106cd5528cc054edd5c81882cb4ae89fd3c065 100644 (file)
@@ -217,6 +217,7 @@ token_t PSI_ParserScan(PSI_Parser *P)
                TO_FLOAT = 'to_float';
                TO_BOOL = 'to_bool';
                NUMBER = [+-]? [0-9]* "."? [0-9]+ ([eE] [+-]? [0-9]+)?;
+               DIGITS = [0-9]+;
 
                "#" .* "\n" { ++P->line; RETURN(PSI_T_COMMENT);}
                "(" {RETURN(PSI_T_LPAREN);}
@@ -226,6 +227,8 @@ token_t PSI_ParserScan(PSI_Parser *P)
                ":" {RETURN(PSI_T_COLON);}
                "{" {RETURN(PSI_T_LBRACE);}
                "}" {RETURN(PSI_T_RBRACE);}
+               "[" {RETURN(PSI_T_LBRACKET);}
+               "]" {RETURN(PSI_T_RBRACKET);}
                "=" {RETURN(PSI_T_EQUALS);}
                "$" {RETURN(PSI_T_DOLLAR);}
                "*" {RETURN(PSI_T_POINTER);}
@@ -272,6 +275,7 @@ token_t PSI_ParserScan(PSI_Parser *P)
                TO_FLOAT {RETURN(PSI_T_TO_FLOAT);}
                TO_BOOL {RETURN(PSI_T_TO_BOOL);}
                NUMBER {RETURN(PSI_T_NUMBER);}
+               DIGITS {RETURN(PSI_T_DIGITS);}
                NAME {RETURN(PSI_T_NAME);}
                NSNAME {RETURN(PSI_T_NSNAME);}
                QUOTED_STRING {RETURN(PSI_T_QUOTED_STRING);}
index 85fac69d8ac37e996d18edb06b7de72cee18db64..ed8b1b473f42cb763f6c1b7878c51fb177754cc8 100644 (file)
@@ -89,13 +89,23 @@ decl_abi(abi) ::= NAME(T). {
 
 %type decl_var {decl_var*}
 decl_var(var) ::= NAME(T). {
-       var = init_decl_var(T->text, 0);
+       var = init_decl_var(T->text, 0, 0);
        free(T);
 }
 decl_var(var) ::= pointers(p) NAME(T). {
-       var = init_decl_var(T->text, p);
+       var = init_decl_var(T->text, p, 0);
        free(T);
 }
+decl_var(var) ::= NAME(T) LBRACKET DIGITS(D) RBRACKET. {
+       var = init_decl_var(T->text, 1, atol(D->text));
+       free(T);
+       free(D);
+}
+decl_var(var) ::= pointers(p) NAME(T) LBRACKET DIGITS(D) RBRACKET. {
+       var = init_decl_var(T->text, p+1, atol(D->text));
+       free(T);
+       free(D);
+}
 
 %type decl_vars {decl_vars*}
 decl_vars(vars) ::= decl_var(var). {