1 
2 #include "php_phalcon.h"
3 #include "phalcon.h"
4 
5 #include <ext/standard/php_smart_string.h>
6 #include <zend_smart_str.h>
7 
8 #include <main/spprintf.h>
9 
10 #include "parser.php7.h"
11 #include "scanner.h"
12 #include "annot.h"
13 
14 #include "kernel/main.h"
15 #include "kernel/exception.h"
16 
17 #define phannot_add_assoc_stringl(var, index, str, len) add_assoc_stringl(var, index, str, len);
18 #define phannot_add_assoc_string(var, index, str) add_assoc_string(var, index, str);
19 
phannot_ret_literal_zval(zval * ret,int type,phannot_parser_token * T)20 static void phannot_ret_literal_zval(zval *ret, int type, phannot_parser_token *T)
21 {
22     array_init(ret);
23 
24 	add_assoc_long(ret, "type", type);
25 	if (T) {
26 		phannot_add_assoc_stringl(ret, "value", T->token, T->token_len);
27         efree(T->token);
28 		efree(T);
29 	}
30 }
31 
phannot_ret_array(zval * ret,zval * items)32 static void phannot_ret_array(zval *ret, zval *items)
33 {
34 	array_init(ret);
35 
36 	add_assoc_long(ret, "type", PHANNOT_T_ARRAY);
37 
38 	if (items) {
39 		add_assoc_zval(ret, "items", items);
40 	}
41 }
42 
phannot_ret_zval_list(zval * ret,zval * list_left,zval * right_list)43 static void phannot_ret_zval_list(zval *ret, zval *list_left, zval *right_list)
44 {
45 	HashTable *list;
46 
47 	array_init(ret);
48 
49 	if (list_left) {
50 
51 		list = Z_ARRVAL_P(list_left);
52 		if (zend_hash_index_exists(list, 0)) {
53             {
54                 zval *item;
55                 ZEND_HASH_FOREACH_VAL(list, item) {
56 
57                     Z_TRY_ADDREF_P(item);
58                     add_next_index_zval(ret, item);
59 
60                 } ZEND_HASH_FOREACH_END();
61             }
62             zval_dtor(list_left);
63 		} else {
64 			add_next_index_zval(ret, list_left);
65 		}
66 	}
67 
68 	add_next_index_zval(ret, right_list);
69 }
70 
phannot_ret_named_item(zval * ret,phannot_parser_token * name,zval * expr)71 static void phannot_ret_named_item(zval *ret, phannot_parser_token *name, zval *expr)
72 {
73 	array_init(ret);
74 
75 	add_assoc_zval(ret, "expr", expr);
76 	if (name != NULL) {
77 		phannot_add_assoc_stringl(ret, "name", name->token, name->token_len);
78         efree(name->token);
79 		efree(name);
80 	}
81 }
82 
phannot_ret_annotation(zval * ret,phannot_parser_token * name,zval * arguments,phannot_scanner_state * state)83 static void phannot_ret_annotation(zval *ret, phannot_parser_token *name, zval *arguments, phannot_scanner_state *state)
84 {
85 	array_init(ret);
86 
87 	add_assoc_long(ret, "type", PHANNOT_T_ANNOTATION);
88 
89 	if (name) {
90 		phannot_add_assoc_stringl(ret, "name", name->token, name->token_len);
91         efree(name->token);
92 		efree(name);
93 	}
94 
95 	if (arguments) {
96 		add_assoc_zval(ret, "arguments", arguments);
97 	}
98 
99 	phannot_add_assoc_string(ret, "file", (char*) state->active_file);
100 	add_assoc_long(ret, "line", state->active_line);
101 }
102