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