-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy patherrors.inc
177 lines (173 loc) · 4.08 KB
/
errors.inc
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
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
struct Error
flags dd ? ; ERR_#
message dd ?
symbol dd ?
preprocessed_data dd ?
preprocessed_length dd ?
next dd ? ; pointer to another Error
; source SourceContext
ends
ERR_CUSTOM = 1
register_volatile_error:
; in:
; edx - 32-bit length followed by string data
; ebx - data for message formatting (only relevant for non-custom messages that contain % character)
; out:
; edx - Error
; preserves: eax, ebx, ecx, esi, edi
cmp [next_pass_needed],0
jne error_ignored
push eax ebx ecx esi edi
or [message_volatile],1
jmp get_error_line
register_delayed_error:
; in:
; edx - error message
; esi - SourceContext
; ebx - data for message formatting (only relevant for non-custom messages that contain % character)
; out:
; edx - Error
; preserves: eax, ebx, ecx, esi, edi
cmp [next_pass_needed],0
jne error_ignored
push eax ebx ecx esi edi
and [message_volatile],0
and [error_line_start],0
and [error_line_end],0
jmp add_error
register_error:
; in:
; edx - error message
; ebx - data for message formatting (only relevant for non-custom messages that contain % character)
; out:
; edx - Error, null when error was not registered
; preserves: eax, ebx, ecx, esi, edi
cmp [next_pass_needed],0
jne error_ignored
push eax ebx ecx esi edi
and [message_volatile],0
get_error_line:
mov eax,[line_start]
mov [error_line_start],eax
mov ecx,[line_end]
cmp [number_of_line_embeddings],0
je error_line_end_ok
mov eax,[line_embeddings]
mov ecx,[eax+LineEmbedding.previous_end]
error_line_end_ok:
mov [error_line_end],ecx
xor esi,esi
add_error:
mov [error_symbol],ebx
lea ebx,[first_error]
xor ecx,ecx
find_last_error:
mov eax,[ebx]
test eax,eax
jz last_error_found
lea ebx,[eax+Error.next]
inc ecx
cmp ecx,[maximum_number_of_errors]
jb find_last_error
pop edi esi ecx ebx eax
xor edx,edx
retn
last_error_found:
cmp [message_volatile],0
jne prepare_volatile_error
test esi,esi
jnz prepare_error
mov esi,[source_context]
prepare_error:
mov ecx,[esi+SourceContext.number_of_entries]
imul ecx,sizeof.SourceEntry
add ecx,sizeof.SourceContext
cmp [esi+ecx-sizeof.SourceEntry+SourceEntry.type],SOURCE_CALM
jne error_source_context_ready
mov eax,[calm_instruction_number]
mov [esi+ecx-sizeof.SourceEntry+SourceEntry.line_number],eax
and [error_line_start],0
and [error_line_end],0
error_source_context_ready:
add ecx,sizeof.Error
add ecx,[error_line_end]
sub ecx,[error_line_start]
mov edi,edx
call malloc
mov [ebx],eax
mov [eax+Error.message],edi
mov ecx,[error_symbol]
mov [eax+Error.symbol],ecx
xor ecx,ecx
mov [eax+Error.flags],ecx
mov [eax+Error.next],ecx
lea edi,[eax+sizeof.Error]
push eax
call clone_source_context
pop edx
store_preprocessed_data:
mov [edx+Error.preprocessed_data],edi
mov esi,[error_line_start]
mov ecx,[error_line_end]
sub ecx,esi
mov [edx+Error.preprocessed_length],ecx
rep movsb
pop edi esi ecx ebx eax
retn
error_ignored:
xor edx,edx
retn
prepare_volatile_error:
mov esi,edx
mov eax,[source_context]
mov ecx,[eax+SourceContext.number_of_entries]
imul ecx,sizeof.SourceEntry
add ecx,sizeof.SourceContext
cmp [eax+ecx-sizeof.SourceEntry+SourceEntry.type],SOURCE_CALM
jne volatile_error_source_context_ready
mov edx,[calm_instruction_number]
mov [eax+ecx-sizeof.SourceEntry+SourceEntry.line_number],edx
and [error_line_start],0
and [error_line_end],0
volatile_error_source_context_ready:
add ecx,sizeof.Error
add ecx,[error_line_end]
sub ecx,[error_line_start]
mov edi,ecx
add ecx,[esi]
inc ecx
call malloc
add edi,eax
mov [ebx],eax
mov edx,eax
mov [edx+Error.message],edi
xor eax,eax
mov [edx+Error.next],eax
mov [edx+Error.flags],eax
lodsd
mov ecx,eax
rep movsb
xor al,al
stosb
mov esi,[source_context]
lea edi,[edx+sizeof.Error]
push edx
call clone_source_context
pop edx
jmp store_preprocessed_data
discard_errors:
mov eax,[first_error]
test eax,eax
jnz discard_error
retn
discard_error:
add eax,sizeof.Error
call release_source_context
sub eax,sizeof.Error
mov ebx,[eax+Error.next]
call mfree
mov eax,ebx
test eax,eax
jnz discard_error
mov [first_error],eax
retn