annotate gcc/go/gofrontend/import.h @ 158:494b0b89df80 default tip

...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Mon, 25 May 2020 18:13:55 +0900
parents 1830386684a0
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 // import.h -- Go frontend import declarations. -*- C++ -*-
kono
parents:
diff changeset
2
kono
parents:
diff changeset
3 // Copyright 2009 The Go Authors. All rights reserved.
kono
parents:
diff changeset
4 // Use of this source code is governed by a BSD-style
kono
parents:
diff changeset
5 // license that can be found in the LICENSE file.
kono
parents:
diff changeset
6
kono
parents:
diff changeset
7 #ifndef GO_IMPORT_H
kono
parents:
diff changeset
8 #define GO_IMPORT_H
kono
parents:
diff changeset
9
kono
parents:
diff changeset
10 #include "export.h"
kono
parents:
diff changeset
11 #include "go-linemap.h"
kono
parents:
diff changeset
12
kono
parents:
diff changeset
13 class Gogo;
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
14 class Block;
111
kono
parents:
diff changeset
15 class Package;
kono
parents:
diff changeset
16 class Type;
kono
parents:
diff changeset
17 class Named_object;
kono
parents:
diff changeset
18 class Named_type;
kono
parents:
diff changeset
19 class Expression;
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
20 class Import_function_body;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
21 class Temporary_statement;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
22 class Unnamed_label;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
23 class Finalize_methods;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
24
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
25 // Expressions can be imported either directly from import data (for
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
26 // simple constant expressions that can appear in a const declaration
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
27 // or as an array length in a type definition) or from an exported
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
28 // function body (for an inlinable function). These two cases happen
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
29 // at different points in the compilation and have different
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
30 // requirements, so it's not easy to unify them. Import_expression is
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
31 // an abstract interface that permits the expression import code to
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
32 // work at either point. When importing expressions that only occur
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
33 // for an inlinable function, the ifb method is available to get the
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
34 // full Import_function_body.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
35
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
36 class Import_expression
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
37 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
38 public:
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
39 // Return the import function body. This should only be called for
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
40 // expressions that can not appear outside of an inlinable function
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
41 // body.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
42 virtual Import_function_body*
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
43 ifb() = 0;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
44
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
45 // The location to report in an error message.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
46 virtual Location
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
47 location() const = 0;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
48
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
49 // Peek at the next character in the input, returning a value from 0
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
50 // to 0xff. Returns -1 at end of stream.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
51 virtual int
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
52 peek_char() = 0;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
53
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
54 // Return the next character and advance.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
55 virtual int
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
56 get_char() = 0;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
57
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
58 // Return true if the next bytes match STR.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
59 virtual bool
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
60 match_c_string(const char* str) = 0;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
61
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
62 // Require that the next bytes match STR.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
63 virtual void
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
64 require_c_string(const char* str) = 0;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
65
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
66 // Advance the stream SKIP bytes.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
67 virtual void
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
68 advance(size_t skip) = 0;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
69
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
70 // Read an identifier.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
71 virtual std::string
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
72 read_identifier() = 0;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
73
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
74 // Read a type.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
75 virtual Type*
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
76 read_type() = 0;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
77
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
78 // Return the maximum valid package index.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
79 virtual size_t
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
80 max_package_index() const = 0;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
81
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
82 // Return the package for a package index.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
83 virtual Package*
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
84 package_at_index(int index) = 0;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
85
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
86 // Return the version number of the export data we're reading.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
87 virtual Export_data_version
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
88 version() const = 0;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
89 };
111
kono
parents:
diff changeset
90
kono
parents:
diff changeset
91 // This class manages importing Go declarations.
kono
parents:
diff changeset
92
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
93 class Import : public Import_expression
111
kono
parents:
diff changeset
94 {
kono
parents:
diff changeset
95 public:
kono
parents:
diff changeset
96 // The Stream class is an interface used to read the data. The
kono
parents:
diff changeset
97 // caller should instantiate a child of this class.
kono
parents:
diff changeset
98 class Stream
kono
parents:
diff changeset
99 {
kono
parents:
diff changeset
100 public:
kono
parents:
diff changeset
101 Stream();
kono
parents:
diff changeset
102 virtual ~Stream();
kono
parents:
diff changeset
103
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
104 // Set the position, for error messages.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
105 void
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
106 set_pos(int pos)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
107 { this->pos_ = pos; }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
108
111
kono
parents:
diff changeset
109 // Return whether we have seen an error.
kono
parents:
diff changeset
110 bool
kono
parents:
diff changeset
111 saw_error() const
kono
parents:
diff changeset
112 { return this->saw_error_; }
kono
parents:
diff changeset
113
kono
parents:
diff changeset
114 // Record that we've seen an error.
kono
parents:
diff changeset
115 void
kono
parents:
diff changeset
116 set_saw_error()
kono
parents:
diff changeset
117 { this->saw_error_ = true; }
kono
parents:
diff changeset
118
kono
parents:
diff changeset
119 // Return the next character (a value from 0 to 0xff) without
kono
parents:
diff changeset
120 // advancing. Returns -1 at end of stream.
kono
parents:
diff changeset
121 int
kono
parents:
diff changeset
122 peek_char();
kono
parents:
diff changeset
123
kono
parents:
diff changeset
124 // Look for LENGTH characters, setting *BYTES to point to them.
kono
parents:
diff changeset
125 // Returns false if the bytes are not available. Does not
kono
parents:
diff changeset
126 // advance.
kono
parents:
diff changeset
127 bool
kono
parents:
diff changeset
128 peek(size_t length, const char** bytes)
kono
parents:
diff changeset
129 { return this->do_peek(length, bytes); }
kono
parents:
diff changeset
130
kono
parents:
diff changeset
131 // Return the next character (a value from 0 to 0xff) and advance
kono
parents:
diff changeset
132 // the read position by 1. Returns -1 at end of stream.
kono
parents:
diff changeset
133 int
kono
parents:
diff changeset
134 get_char()
kono
parents:
diff changeset
135 {
kono
parents:
diff changeset
136 int c = this->peek_char();
kono
parents:
diff changeset
137 this->advance(1);
kono
parents:
diff changeset
138 return c;
kono
parents:
diff changeset
139 }
kono
parents:
diff changeset
140
kono
parents:
diff changeset
141 // Return true if at the end of the stream.
kono
parents:
diff changeset
142 bool
kono
parents:
diff changeset
143 at_eof()
kono
parents:
diff changeset
144 { return this->peek_char() == -1; }
kono
parents:
diff changeset
145
kono
parents:
diff changeset
146 // Return true if the next bytes match STR.
kono
parents:
diff changeset
147 bool
kono
parents:
diff changeset
148 match_c_string(const char* str)
kono
parents:
diff changeset
149 { return this->match_bytes(str, strlen(str)); }
kono
parents:
diff changeset
150
kono
parents:
diff changeset
151 // Return true if the next LENGTH bytes match BYTES.
kono
parents:
diff changeset
152 bool
kono
parents:
diff changeset
153 match_bytes(const char* bytes, size_t length);
kono
parents:
diff changeset
154
kono
parents:
diff changeset
155 // Give an error if the next bytes do not match STR. Advance the
kono
parents:
diff changeset
156 // read position by the length of STR.
kono
parents:
diff changeset
157 void
kono
parents:
diff changeset
158 require_c_string(Location location, const char* str)
kono
parents:
diff changeset
159 { this->require_bytes(location, str, strlen(str)); }
kono
parents:
diff changeset
160
kono
parents:
diff changeset
161 // Given an error if the next LENGTH bytes do not match BYTES.
kono
parents:
diff changeset
162 // Advance the read position by LENGTH.
kono
parents:
diff changeset
163 void
kono
parents:
diff changeset
164 require_bytes(Location, const char* bytes, size_t length);
kono
parents:
diff changeset
165
kono
parents:
diff changeset
166 // Advance the read position by SKIP bytes.
kono
parents:
diff changeset
167 void
kono
parents:
diff changeset
168 advance(size_t skip)
kono
parents:
diff changeset
169 {
kono
parents:
diff changeset
170 this->do_advance(skip);
kono
parents:
diff changeset
171 this->pos_ += skip;
kono
parents:
diff changeset
172 }
kono
parents:
diff changeset
173
kono
parents:
diff changeset
174 // Return the current read position. This returns int because it
kono
parents:
diff changeset
175 // is more convenient in error reporting. FIXME.
kono
parents:
diff changeset
176 int
kono
parents:
diff changeset
177 pos()
kono
parents:
diff changeset
178 { return static_cast<int>(this->pos_); }
kono
parents:
diff changeset
179
kono
parents:
diff changeset
180 protected:
kono
parents:
diff changeset
181 // This function should set *BYTES to point to a buffer holding
kono
parents:
diff changeset
182 // the LENGTH bytes at the current read position. It should
kono
parents:
diff changeset
183 // return false if the bytes are not available. This should not
kono
parents:
diff changeset
184 // change the current read position.
kono
parents:
diff changeset
185 virtual bool
kono
parents:
diff changeset
186 do_peek(size_t length, const char** bytes) = 0;
kono
parents:
diff changeset
187
kono
parents:
diff changeset
188 // This function should advance the current read position LENGTH
kono
parents:
diff changeset
189 // bytes.
kono
parents:
diff changeset
190 virtual void
kono
parents:
diff changeset
191 do_advance(size_t skip) = 0;
kono
parents:
diff changeset
192
kono
parents:
diff changeset
193 private:
kono
parents:
diff changeset
194 // The current read position.
kono
parents:
diff changeset
195 size_t pos_;
kono
parents:
diff changeset
196 // True if we've seen an error reading from this stream.
kono
parents:
diff changeset
197 bool saw_error_;
kono
parents:
diff changeset
198 };
kono
parents:
diff changeset
199
kono
parents:
diff changeset
200 // Find import data. This searches the file system for FILENAME and
kono
parents:
diff changeset
201 // returns a pointer to a Stream object to read the data that it
kono
parents:
diff changeset
202 // exports. LOCATION is the location of the import statement.
kono
parents:
diff changeset
203 // RELATIVE_IMPORT_PATH is used as a prefix for a relative import.
kono
parents:
diff changeset
204 static Stream*
kono
parents:
diff changeset
205 open_package(const std::string& filename, Location location,
kono
parents:
diff changeset
206 const std::string& relative_import_path);
kono
parents:
diff changeset
207
kono
parents:
diff changeset
208 // Constructor.
kono
parents:
diff changeset
209 Import(Stream*, Location);
kono
parents:
diff changeset
210
kono
parents:
diff changeset
211 // Register the builtin types.
kono
parents:
diff changeset
212 void
kono
parents:
diff changeset
213 register_builtin_types(Gogo*);
kono
parents:
diff changeset
214
kono
parents:
diff changeset
215 // Import everything defined in the stream. LOCAL_NAME is the local
kono
parents:
diff changeset
216 // name to be used for bindings; if it is the string "." then
kono
parents:
diff changeset
217 // bindings should be inserted in the global scope. If LOCAL_NAME
kono
parents:
diff changeset
218 // is the empty string then the name of the package itself is the
kono
parents:
diff changeset
219 // local name. This returns the imported package, or NULL on error.
kono
parents:
diff changeset
220 Package*
kono
parents:
diff changeset
221 import(Gogo*, const std::string& local_name, bool is_local_name_exported);
kono
parents:
diff changeset
222
kono
parents:
diff changeset
223 // The location of the import statement.
kono
parents:
diff changeset
224 Location
kono
parents:
diff changeset
225 location() const
kono
parents:
diff changeset
226 { return this->location_; }
kono
parents:
diff changeset
227
kono
parents:
diff changeset
228 // Return the package we are importing.
kono
parents:
diff changeset
229 Package*
kono
parents:
diff changeset
230 package() const
kono
parents:
diff changeset
231 { return this->package_; }
kono
parents:
diff changeset
232
kono
parents:
diff changeset
233 // Return the next character.
kono
parents:
diff changeset
234 int
kono
parents:
diff changeset
235 peek_char()
kono
parents:
diff changeset
236 { return this->stream_->peek_char(); }
kono
parents:
diff changeset
237
kono
parents:
diff changeset
238 // Return the next character and advance.
kono
parents:
diff changeset
239 int
kono
parents:
diff changeset
240 get_char()
kono
parents:
diff changeset
241 { return this->stream_->get_char(); }
kono
parents:
diff changeset
242
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
243 // Read LENGTH characters into a string and advance past them. On
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
244 // EOF reports an error and returns an empty string.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
245 std::string
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
246 read(size_t length);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
247
111
kono
parents:
diff changeset
248 // Return true at the end of the stream.
kono
parents:
diff changeset
249 bool
kono
parents:
diff changeset
250 at_eof()
kono
parents:
diff changeset
251 { return this->stream_->at_eof(); }
kono
parents:
diff changeset
252
kono
parents:
diff changeset
253 // Return whether the next bytes match STR.
kono
parents:
diff changeset
254 bool
kono
parents:
diff changeset
255 match_c_string(const char* str)
kono
parents:
diff changeset
256 { return this->stream_->match_c_string(str); }
kono
parents:
diff changeset
257
kono
parents:
diff changeset
258 // Require that the next bytes match STR.
kono
parents:
diff changeset
259 void
kono
parents:
diff changeset
260 require_c_string(const char* str)
kono
parents:
diff changeset
261 { this->stream_->require_c_string(this->location_, str); }
kono
parents:
diff changeset
262
kono
parents:
diff changeset
263 // Advance the stream SKIP bytes.
kono
parents:
diff changeset
264 void
kono
parents:
diff changeset
265 advance(size_t skip)
kono
parents:
diff changeset
266 { this->stream_->advance(skip); }
kono
parents:
diff changeset
267
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
268 // Stream position, for error reporting.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
269 int
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
270 pos()
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
271 { return this->stream_->pos(); }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
272
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
273 // Return the version number of the export data we're reading.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
274 Export_data_version
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
275 version() const { return this->version_; }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
276
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
277 // Skip a semicolon if using an older version.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
278 void
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
279 require_semicolon_if_old_version()
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
280 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
281 if (this->version_ == EXPORT_FORMAT_V1
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
282 || this->version_ == EXPORT_FORMAT_V2)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
283 this->require_c_string(";");
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
284 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
285
111
kono
parents:
diff changeset
286 // Read an identifier.
kono
parents:
diff changeset
287 std::string
kono
parents:
diff changeset
288 read_identifier();
kono
parents:
diff changeset
289
kono
parents:
diff changeset
290 // Read a name. This is like read_identifier, except that a "?" is
kono
parents:
diff changeset
291 // returned as an empty string. This matches Export::write_name.
kono
parents:
diff changeset
292 std::string
kono
parents:
diff changeset
293 read_name();
kono
parents:
diff changeset
294
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
295 // Return the maximum valid package index. This is the size of
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
296 // packages_ because we will subtract 1 in package_at_index.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
297 size_t
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
298 max_package_index() const
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
299 { return this->packages_.size(); }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
300
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
301 // Return the package at an index. (We subtract 1 because package
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
302 // index 0 is not used.)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
303 Package*
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
304 package_at_index(int index)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
305 { return this->packages_.at(index - 1); }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
306
111
kono
parents:
diff changeset
307 // Read a type.
kono
parents:
diff changeset
308 Type*
kono
parents:
diff changeset
309 read_type();
kono
parents:
diff changeset
310
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
311 // Return the type for a type index. INPUT_NAME and INPUT_OFFSET
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
312 // are only for error reporting. PARSED is set to whether we parsed
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
313 // the type information for a new type.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
314 Type*
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
315 type_for_index(int index, const std::string& input_name,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
316 size_t input_offset, bool* parsed);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
317
111
kono
parents:
diff changeset
318 // Read an escape note.
kono
parents:
diff changeset
319 std::string
kono
parents:
diff changeset
320 read_escape();
kono
parents:
diff changeset
321
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
322 // Clear the stream when it is no longer accessible.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
323 void
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
324 clear_stream()
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
325 { this->stream_ = NULL; }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
326
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
327 // Just so that Import implements Import_expression.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
328 Import_function_body*
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
329 ifb()
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
330 { return NULL; }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
331
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
332 // Read a qualified identifier from an Import_expression. Sets
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
333 // *NAME, *PKG, and *IS_EXPORTED, and reports whether it succeeded.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
334 static bool
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
335 read_qualified_identifier(Import_expression*, std::string* name,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
336 Package** pkg, bool* is_exported);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
337
111
kono
parents:
diff changeset
338 private:
kono
parents:
diff changeset
339 static Stream*
kono
parents:
diff changeset
340 try_package_in_directory(const std::string&, Location);
kono
parents:
diff changeset
341
kono
parents:
diff changeset
342 static int
kono
parents:
diff changeset
343 try_suffixes(std::string*);
kono
parents:
diff changeset
344
kono
parents:
diff changeset
345 static Stream*
kono
parents:
diff changeset
346 find_export_data(const std::string& filename, int fd, Location);
kono
parents:
diff changeset
347
kono
parents:
diff changeset
348 static Stream*
kono
parents:
diff changeset
349 find_object_export_data(const std::string& filename, int fd,
kono
parents:
diff changeset
350 off_t offset, Location);
kono
parents:
diff changeset
351
kono
parents:
diff changeset
352 static const int archive_magic_len = 8;
kono
parents:
diff changeset
353
kono
parents:
diff changeset
354 static bool
kono
parents:
diff changeset
355 is_archive_magic(const char*);
kono
parents:
diff changeset
356
kono
parents:
diff changeset
357 static Stream*
kono
parents:
diff changeset
358 find_archive_export_data(const std::string& filename, int fd,
kono
parents:
diff changeset
359 Location);
kono
parents:
diff changeset
360
kono
parents:
diff changeset
361 // Read a package line.
kono
parents:
diff changeset
362 void
kono
parents:
diff changeset
363 read_one_package();
kono
parents:
diff changeset
364
kono
parents:
diff changeset
365 // Read an import line.
kono
parents:
diff changeset
366 void
kono
parents:
diff changeset
367 read_one_import();
kono
parents:
diff changeset
368
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
369 // Read an indirectimport line.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
370 void
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
371 read_one_indirect_import();
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
372
111
kono
parents:
diff changeset
373 // Read the import control functions and init graph.
kono
parents:
diff changeset
374 void
kono
parents:
diff changeset
375 read_import_init_fns(Gogo*);
kono
parents:
diff changeset
376
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
377 // Read the types.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
378 bool
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
379 read_types();
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
380
111
kono
parents:
diff changeset
381 // Import a constant.
kono
parents:
diff changeset
382 void
kono
parents:
diff changeset
383 import_const();
kono
parents:
diff changeset
384
kono
parents:
diff changeset
385 // Import a type.
kono
parents:
diff changeset
386 void
kono
parents:
diff changeset
387 import_type();
kono
parents:
diff changeset
388
kono
parents:
diff changeset
389 // Import a variable.
kono
parents:
diff changeset
390 void
kono
parents:
diff changeset
391 import_var();
kono
parents:
diff changeset
392
kono
parents:
diff changeset
393 // Import a function.
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
394 void
111
kono
parents:
diff changeset
395 import_func(Package*);
kono
parents:
diff changeset
396
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
397 // Parse a type definition.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
398 bool
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
399 parse_type(int index);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
400
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
401 // Read a named type and store it at this->type_[index].
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
402 Type*
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
403 read_named_type(int index);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
404
111
kono
parents:
diff changeset
405 // Register a single builtin type.
kono
parents:
diff changeset
406 void
kono
parents:
diff changeset
407 register_builtin_type(Gogo*, const char* name, Builtin_code);
kono
parents:
diff changeset
408
kono
parents:
diff changeset
409 // Get an integer from a string.
kono
parents:
diff changeset
410 bool
kono
parents:
diff changeset
411 string_to_int(const std::string&, bool is_neg_ok, int* ret);
kono
parents:
diff changeset
412
kono
parents:
diff changeset
413 // Get an unsigned integer from a string.
kono
parents:
diff changeset
414 bool
kono
parents:
diff changeset
415 string_to_unsigned(const std::string& s, unsigned* ret)
kono
parents:
diff changeset
416 {
kono
parents:
diff changeset
417 int ivalue;
kono
parents:
diff changeset
418 if (!this->string_to_int(s, false, &ivalue))
kono
parents:
diff changeset
419 return false;
kono
parents:
diff changeset
420 *ret = static_cast<unsigned>(ivalue);
kono
parents:
diff changeset
421 return true;
kono
parents:
diff changeset
422 }
kono
parents:
diff changeset
423
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
424 // Finalize methods for newly imported types.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
425 void
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
426 finalize_methods();
111
kono
parents:
diff changeset
427
kono
parents:
diff changeset
428 // The general IR.
kono
parents:
diff changeset
429 Gogo* gogo_;
kono
parents:
diff changeset
430 // The stream from which to read import data.
kono
parents:
diff changeset
431 Stream* stream_;
kono
parents:
diff changeset
432 // The location of the import statement we are processing.
kono
parents:
diff changeset
433 Location location_;
kono
parents:
diff changeset
434 // The package we are importing.
kono
parents:
diff changeset
435 Package* package_;
kono
parents:
diff changeset
436 // Whether to add new objects to the global scope, rather than to a
kono
parents:
diff changeset
437 // package scope.
kono
parents:
diff changeset
438 bool add_to_globals_;
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
439 // Mapping from package index to package.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
440 std::vector<Package*> packages_;
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
441 // All type data.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
442 std::string type_data_;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
443 // Position of type data in the stream.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
444 int type_pos_;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
445 // Mapping from type code to offset/length in type_data_.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
446 std::vector<std::pair<size_t, size_t> > type_offsets_;
111
kono
parents:
diff changeset
447 // Mapping from negated builtin type codes to Type structures.
kono
parents:
diff changeset
448 std::vector<Named_type*> builtin_types_;
kono
parents:
diff changeset
449 // Mapping from exported type codes to Type structures.
kono
parents:
diff changeset
450 std::vector<Type*> types_;
kono
parents:
diff changeset
451 // Version of export data we're reading.
kono
parents:
diff changeset
452 Export_data_version version_;
kono
parents:
diff changeset
453 };
kono
parents:
diff changeset
454
kono
parents:
diff changeset
455 // Read import data from a string.
kono
parents:
diff changeset
456
kono
parents:
diff changeset
457 class Stream_from_string : public Import::Stream
kono
parents:
diff changeset
458 {
kono
parents:
diff changeset
459 public:
kono
parents:
diff changeset
460 Stream_from_string(const std::string& str)
kono
parents:
diff changeset
461 : str_(str), pos_(0)
kono
parents:
diff changeset
462 { }
kono
parents:
diff changeset
463
kono
parents:
diff changeset
464 protected:
kono
parents:
diff changeset
465 bool
kono
parents:
diff changeset
466 do_peek(size_t length, const char** bytes)
kono
parents:
diff changeset
467 {
kono
parents:
diff changeset
468 if (this->pos_ + length > this->str_.length())
kono
parents:
diff changeset
469 return false;
kono
parents:
diff changeset
470 *bytes = this->str_.data() + this->pos_;
kono
parents:
diff changeset
471 return true;
kono
parents:
diff changeset
472 }
kono
parents:
diff changeset
473
kono
parents:
diff changeset
474 void
kono
parents:
diff changeset
475 do_advance(size_t len)
kono
parents:
diff changeset
476 { this->pos_ += len; }
kono
parents:
diff changeset
477
kono
parents:
diff changeset
478 private:
kono
parents:
diff changeset
479 // The string of data we are reading.
kono
parents:
diff changeset
480 std::string str_;
kono
parents:
diff changeset
481 // The current position within the string.
kono
parents:
diff changeset
482 size_t pos_;
kono
parents:
diff changeset
483 };
kono
parents:
diff changeset
484
kono
parents:
diff changeset
485 // Read import data from a buffer allocated using malloc.
kono
parents:
diff changeset
486
kono
parents:
diff changeset
487 class Stream_from_buffer : public Import::Stream
kono
parents:
diff changeset
488 {
kono
parents:
diff changeset
489 public:
kono
parents:
diff changeset
490 Stream_from_buffer(char* buf, size_t length)
kono
parents:
diff changeset
491 : buf_(buf), length_(length), pos_(0)
kono
parents:
diff changeset
492 { }
kono
parents:
diff changeset
493
kono
parents:
diff changeset
494 ~Stream_from_buffer()
kono
parents:
diff changeset
495 { free(this->buf_); }
kono
parents:
diff changeset
496
kono
parents:
diff changeset
497 protected:
kono
parents:
diff changeset
498 bool
kono
parents:
diff changeset
499 do_peek(size_t length, const char** bytes)
kono
parents:
diff changeset
500 {
kono
parents:
diff changeset
501 if (this->pos_ + length > this->length_)
kono
parents:
diff changeset
502 return false;
kono
parents:
diff changeset
503 *bytes = this->buf_ + this->pos_;
kono
parents:
diff changeset
504 return true;
kono
parents:
diff changeset
505 }
kono
parents:
diff changeset
506
kono
parents:
diff changeset
507 void
kono
parents:
diff changeset
508 do_advance(size_t len)
kono
parents:
diff changeset
509 { this->pos_ += len; }
kono
parents:
diff changeset
510
kono
parents:
diff changeset
511 private:
kono
parents:
diff changeset
512 // The data we are reading.
kono
parents:
diff changeset
513 char* buf_;
kono
parents:
diff changeset
514 // The length of the buffer.
kono
parents:
diff changeset
515 size_t length_;
kono
parents:
diff changeset
516 // The current position within the buffer.
kono
parents:
diff changeset
517 size_t pos_;
kono
parents:
diff changeset
518 };
kono
parents:
diff changeset
519
kono
parents:
diff changeset
520 // Read import data from an open file descriptor.
kono
parents:
diff changeset
521
kono
parents:
diff changeset
522 class Stream_from_file : public Import::Stream
kono
parents:
diff changeset
523 {
kono
parents:
diff changeset
524 public:
kono
parents:
diff changeset
525 Stream_from_file(int fd);
kono
parents:
diff changeset
526
kono
parents:
diff changeset
527 ~Stream_from_file();
kono
parents:
diff changeset
528
kono
parents:
diff changeset
529 protected:
kono
parents:
diff changeset
530 bool
kono
parents:
diff changeset
531 do_peek(size_t, const char**);
kono
parents:
diff changeset
532
kono
parents:
diff changeset
533 void
kono
parents:
diff changeset
534 do_advance(size_t);
kono
parents:
diff changeset
535
kono
parents:
diff changeset
536 private:
kono
parents:
diff changeset
537 // No copying.
kono
parents:
diff changeset
538 Stream_from_file(const Stream_from_file&);
kono
parents:
diff changeset
539 Stream_from_file& operator=(const Stream_from_file&);
kono
parents:
diff changeset
540
kono
parents:
diff changeset
541 // The file descriptor.
kono
parents:
diff changeset
542 int fd_;
kono
parents:
diff changeset
543 // Data read from the file.
kono
parents:
diff changeset
544 std::string data_;
kono
parents:
diff changeset
545 };
kono
parents:
diff changeset
546
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
547 // Read import data from an offset into a std::string. This uses a
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
548 // reference to the string, to avoid copying, so the string must be
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
549 // kept alive through some other mechanism.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
550
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
551 class Stream_from_string_ref : public Import::Stream
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
552 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
553 public:
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
554 Stream_from_string_ref(const std::string& str, size_t offset, size_t length)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
555 : str_(str), pos_(offset), end_(offset + length)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
556 { }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
557
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
558 ~Stream_from_string_ref()
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
559 {}
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
560
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
561 protected:
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
562 bool
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
563 do_peek(size_t length, const char** bytes)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
564 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
565 if (this->pos_ + length > this->end_)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
566 return false;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
567 *bytes = &this->str_[this->pos_];
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
568 return true;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
569 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
570
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
571 void
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
572 do_advance(size_t length)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
573 { this->pos_ += length; }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
574
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
575 private:
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
576 // A reference to the string we are reading from.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
577 const std::string& str_;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
578 // The current offset into the string.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
579 size_t pos_;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
580 // The index after the last byte we can read.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
581 size_t end_;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
582 };
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
583
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
584 // Class to manage importing a function body. This is passed around
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
585 // to Statements and Expressions. It parses the function into the IR.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
586
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
587 class Import_function_body : public Import_expression
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
588 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
589 public:
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
590 Import_function_body(Gogo* gogo, Import* imp, Named_object* named_object,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
591 const std::string& body, size_t off, Block* block,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
592 int indent);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
593 ~Import_function_body();
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
594
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
595 // The IR.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
596 Gogo*
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
597 gogo()
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
598 { return this->gogo_; }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
599
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
600 // The location to report in an error message.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
601 Location
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
602 location() const
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
603 { return this->imp_->location(); }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
604
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
605 // The function we are importing.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
606 Named_object*
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
607 function() const
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
608 { return this->named_object_; }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
609
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
610 // A reference to the body we are reading.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
611 const std::string&
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
612 body() const
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
613 { return this->body_; }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
614
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
615 // The current offset into the body.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
616 size_t
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
617 off()
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
618 { return this->off_; }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
619
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
620 // Update the offset into the body.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
621 void
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
622 set_off(size_t off)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
623 { this->off_ = off; }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
624
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
625 // Advance the offset by SKIP bytes.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
626 void
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
627 advance(size_t skip)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
628 { this->off_ += skip; }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
629
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
630 // The current block.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
631 Block*
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
632 block()
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
633 { return this->blocks_.back(); }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
634
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
635 // Begin importing a new block BLOCK nested within the current block.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
636 void
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
637 begin_block(Block *block)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
638 { this->blocks_.push_back(block); }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
639
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
640 // Record the fact that we're done importing the current block.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
641 void
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
642 finish_block()
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
643 { this->blocks_.pop_back(); }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
644
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
645 // The current indentation.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
646 int
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
647 indent() const
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
648 { return this->indent_; }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
649
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
650 // Increment the indentation level.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
651 void
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
652 increment_indent()
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
653 { ++this->indent_; }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
654
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
655 // Decrement the indentation level.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
656 void
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
657 decrement_indent()
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
658 { --this->indent_; }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
659
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
660 // The name of the function we are parsing.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
661 const std::string&
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
662 name() const;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
663
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
664 // Return the next character in the input stream, or -1 at the end.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
665 int
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
666 peek_char()
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
667 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
668 if (this->body_.length() <= this->off_)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
669 return -1;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
670 return static_cast<unsigned char>(this->body_[this->off_]);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
671 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
672
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
673 // Return the next character and advance.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
674 int
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
675 get_char()
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
676 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
677 if (this->body_.length() <= this->off_)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
678 return -1;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
679 int c = static_cast<unsigned char>(this->body_[this->off_]);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
680 this->off_++;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
681 return c;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
682 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
683
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
684 // Return whether the C string matches the current body position.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
685 bool
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
686 match_c_string(const char* str)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
687 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
688 size_t len = strlen(str);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
689 return (this->body_.length() >= this->off_ + len
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
690 && this->body_.compare(this->off_, len, str) == 0);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
691 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
692
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
693 // Give an error if the next bytes do not match STR. Advance the
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
694 // offset by the length of STR.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
695 void
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
696 require_c_string(const char* str);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
697
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
698 // Read an identifier.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
699 std::string
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
700 read_identifier();
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
701
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
702 // Read a type.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
703 Type*
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
704 read_type();
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
705
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
706 Export_data_version
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
707 version() const
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
708 { return this->imp_->version(); }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
709
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
710 // Record the index of a temporary statement.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
711 void
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
712 record_temporary(Temporary_statement*, unsigned int);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
713
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
714 // Return a temporary statement given an index.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
715 Temporary_statement*
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
716 temporary_statement(unsigned int);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
717
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
718 // Return an unnamed label given an index, defining the label if we
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
719 // haven't seen it already.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
720 Unnamed_label*
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
721 unnamed_label(unsigned int, Location);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
722
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
723 // Implement Import_expression.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
724 Import_function_body*
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
725 ifb()
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
726 { return this; }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
727
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
728 // Return the maximum valid package index.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
729 size_t
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
730 max_package_index() const
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
731 { return this->imp_->max_package_index(); }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
732
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
733 // Return the package at an index.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
734 Package*
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
735 package_at_index(int index)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
736 { return this->imp_->package_at_index(index); }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
737
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
738 // Return whether we have seen an error.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
739 bool
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
740 saw_error() const
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
741 { return this->saw_error_; }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
742
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
743 // Record that we have seen an error.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
744 void
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
745 set_saw_error()
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
746 { this->saw_error_ = true; }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
747
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
748 private:
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
749 static size_t
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
750 next_size(size_t);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
751
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
752 // The IR.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
753 Gogo* gogo_;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
754 // The importer.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
755 Import* imp_;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
756 // The function we are parsing.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
757 Named_object* named_object_;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
758 // The exported data we are parsing. Note that this is a reference;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
759 // the body string must laster longer than this object.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
760 const std::string& body_;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
761 // The current offset into body_.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
762 size_t off_;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
763 // Stack to record nesting of blocks being imported.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
764 std::vector<Block *> blocks_;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
765 // Current expected indentation level.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
766 int indent_;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
767 // Temporary statements by index.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
768 std::vector<Temporary_statement*> temporaries_;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
769 // Unnamed labels by index.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
770 std::vector<Unnamed_label*> labels_;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
771 // Whether we've seen an error. Used to avoid reporting excess
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
772 // errors.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
773 bool saw_error_;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
774 };
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
775
111
kono
parents:
diff changeset
776 #endif // !defined(GO_IMPORT_H)