File: parser_help.h

package info (click to toggle)
swftools 0.9.2%2Bgit20130725-2
  • links: PTS, VCS
  • area: main
  • in suites: jessie, jessie-kfreebsd
  • size: 8,680 kB
  • ctags: 17,348
  • sloc: ansic: 108,712; sh: 8,494; cpp: 8,040; yacc: 2,260; lisp: 904; makefile: 601; python: 300
file content (132 lines) | stat: -rw-r--r-- 4,960 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
#ifndef __parse_help__
#define  __parse_help__

#include "state.h"
#include "expr.h"
#include "tokenizer.h"
#include "common.h"

typedef struct _global {
    abc_file_t*file;

    parsedclass_list_t*classes;
    abc_script_t*classinit;

    abc_script_t*init; //package-level code

    dict_t*token2info;
    dict_t*file2token2info;
} global_t;

extern global_t*global;

typedef struct _variable {
    int index;
    classinfo_t*type;
    char init;
    char kill;
    char is_parameter;
    methodstate_t*is_inner_method;
} variable_t;

void initialize_file(char*filename);
void finish_file();

void initialize_parser();
void* finish_parser();

#define FLAG_PUBLIC 256
#define FLAG_PROTECTED 512
#define FLAG_PRIVATE 1024
#define FLAG_PACKAGEINTERNAL 2048
#define FLAG_NAMESPACE 4096

slotinfo_t* find_class(const char*name);
char is_break_or_jump(code_t*c);
code_t* insert_finally(code_t*c, code_t*finally, int tempvar);
typedcode_t push_class(slotinfo_t*a);
slotinfo_t* find_class(const char*name);
namespace_list_t*get_current_imports();
const char* get_package_from_name(const char*name);
char is_pushundefined(code_t*c);
code_t* coerce_to_type(code_t*c, classinfo_t*t);
code_t*converttype(code_t*c, classinfo_t*from, classinfo_t*to);
void continuejumpsto(code_t*c, char*name, code_t*jump);
void breakjumpsto(code_t*c, char*name, code_t*jump);
void insert_unresolved(methodstate_t*m, dict_t*xvars, dict_t*allvars);
void startfunction(modifiers_t*mod, enum yytokentype getset, char*name, params_t*params, classinfo_t*return_type);
void function_initvars(methodstate_t*m, char has_params, params_t*params, int flags, char var0);
abc_method_t* endfunction(modifiers_t*mod, enum yytokentype getset, char*name, params_t*params, classinfo_t*return_type, code_t*body);
void innerfunction(char*name, params_t*params, classinfo_t*return_type);
methodinfo_t*registerfunction(enum yytokentype getset, modifiers_t*mod, char*name, params_t*params, classinfo_t*return_type, int slot);
void check_override(memberinfo_t*m, int flags);
void check_constant_against_type(classinfo_t*t, constant_t*c);
void check_code_for_break(code_t*c);
void startclass(modifiers_t* mod, char*classname, classinfo_t*extends, classinfo_list_t*implements);
void endclass();
void innerfunctions2vars(methodstate_t*m);
memberinfo_t* findmember_nsset(classinfo_t*cls, const char*name, char recurse, char is_static);
namespace_t modifiers2access(modifiers_t*mod);
const char* lookup_namespace(const char*name);
void startpackage(char*name);
void endpackage();
code_t* wrap_function(code_t*c,code_t*header, code_t*body);
code_t* method_header(methodstate_t*m);
code_t* add_scope_code(code_t*c, methodstate_t*m, char init);
void unknown_variable(char*name);
code_t* var_block(code_t*body, dict_t*vars);
int gettempvar();
int new_variable(methodstate_t*method, const char*name, classinfo_t*type, char init, char maybeslot);
variable_t* new_variable2(methodstate_t*method, const char*name, classinfo_t*type, char init, char maybeslot);
int alloc_local();
code_t*defaultvalue(code_t*c, classinfo_t*type);
char variable_exists(char*name);
variable_t* find_variable_safe(state_t*s, char*name);
variable_t* find_variable(state_t*s, const char*name);
variable_t* find_slot(methodstate_t*m, const char*name);
code_t* method_header(methodstate_t*m);
code_t* wrap_function(code_t*c,code_t*header, code_t*body);
void function_initvars(methodstate_t*m, char has_params, params_t*params, int flags, char var0);
void state_destroy(state_t*state);
void as3_set_define(const char*c);

/* protected handling here is a big hack: we just assume the protectedns
   is package:class. the correct approach would be to add the proper
   namespace to all protected members in the registry, even though that
   would slow down searching */
#define MEMBER_MULTINAME(m,f,n) \
    multiname_t m;\
    namespace_t m##_ns;\
    if(f) { \
        m##_ns.access = ((slotinfo_t*)(f))->access; \
        if(m##_ns.access == ACCESS_NAMESPACE) \
            m##_ns.name = ((slotinfo_t*)(f))->package; \
        else if(m##_ns.access == ACCESS_PROTECTED && (f)->parent) \
            m##_ns.name = concat3((f)->parent->package,":",(f)->parent->name); \
        else \
            m##_ns.name = ""; \
        m.type = QNAME; \
        m.ns = &m##_ns; \
        m.namespace_set = 0; \
        m.name = ((slotinfo_t*)(f))->name; \
    } else { \
        m.type = MULTINAME; \
        m.ns =0; \
        m.namespace_set = &nopackage_namespace_set; \
        m.name = n; \
    }

/* warning: list length of namespace set is undefined */
#define MULTINAME_LATE(m, access, package) \
    namespace_t m##_ns = {access, package}; \
    namespace_set_t m##_nsset; \
    namespace_list_t m##_l;m##_l.next = 0; \
    m##_nsset.namespaces = &m##_l; \
    m##_nsset = m##_nsset; \
    m##_l.namespace = &m##_ns; \
    multiname_t m = {MULTINAMEL, 0, &m##_nsset, 0};

extern namespace_t stdns;
extern namespace_set_t nopackage_namespace_set;

#endif