Skip to content

Commit f31c641

Browse files
tebbiCommit Bot
authored andcommitted
[torque] add unittest for Earley parser
Change-Id: I02c117ef66480eb73eb9cc1d4f80bbc64e9d3624 Reviewed-on: https://chromium-review.googlesource.com/1146655 Commit-Queue: Tobias Tebbi <[email protected]> Reviewed-by: Jakob Gruber <[email protected]> Reviewed-by: Jaroslav Sevcik <[email protected]> Cr-Commit-Position: refs/heads/master@{#54649}
1 parent 311808e commit f31c641

11 files changed

Lines changed: 247 additions & 129 deletions

File tree

BUILD.gn

Lines changed: 44 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -2860,6 +2860,46 @@ v8_source_set("v8_base") {
28602860
}
28612861
}
28622862

2863+
v8_source_set("torque_base") {
2864+
visibility = [ ":*" ] # Only targets in this file can depend on this.
2865+
2866+
sources = [
2867+
"src/torque/ast.h",
2868+
"src/torque/contextual.h",
2869+
"src/torque/declarable.cc",
2870+
"src/torque/declarable.h",
2871+
"src/torque/declaration-visitor.cc",
2872+
"src/torque/declaration-visitor.h",
2873+
"src/torque/declarations.cc",
2874+
"src/torque/declarations.h",
2875+
"src/torque/earley-parser.cc",
2876+
"src/torque/earley-parser.h",
2877+
"src/torque/file-visitor.cc",
2878+
"src/torque/file-visitor.h",
2879+
"src/torque/global-context.h",
2880+
"src/torque/implementation-visitor.cc",
2881+
"src/torque/implementation-visitor.h",
2882+
"src/torque/scope.cc",
2883+
"src/torque/scope.h",
2884+
"src/torque/source-positions.cc",
2885+
"src/torque/source-positions.h",
2886+
"src/torque/torque-parser.cc",
2887+
"src/torque/torque-parser.h",
2888+
"src/torque/type-oracle.cc",
2889+
"src/torque/type-oracle.h",
2890+
"src/torque/types.cc",
2891+
"src/torque/types.h",
2892+
"src/torque/utils.cc",
2893+
"src/torque/utils.h",
2894+
]
2895+
2896+
deps = [
2897+
":v8_libbase",
2898+
]
2899+
2900+
configs = [ ":internal_config" ]
2901+
}
2902+
28632903
v8_component("v8_libbase") {
28642904
sources = [
28652905
"src/base/adapters.h",
@@ -3165,45 +3205,15 @@ if (current_toolchain == v8_snapshot_toolchain) {
31653205
visibility = [ ":*" ] # Only targets in this file can depend on this.
31663206

31673207
sources = [
3168-
"src/torque/ast.h",
3169-
"src/torque/contextual.h",
3170-
"src/torque/declarable.cc",
3171-
"src/torque/declarable.h",
3172-
"src/torque/declaration-visitor.cc",
3173-
"src/torque/declaration-visitor.h",
3174-
"src/torque/declarations.cc",
3175-
"src/torque/declarations.h",
3176-
"src/torque/earley-parser.cc",
3177-
"src/torque/earley-parser.h",
3178-
"src/torque/file-visitor.cc",
3179-
"src/torque/file-visitor.h",
3180-
"src/torque/global-context.h",
3181-
"src/torque/implementation-visitor.cc",
3182-
"src/torque/implementation-visitor.h",
3183-
"src/torque/scope.cc",
3184-
"src/torque/scope.h",
3185-
"src/torque/source-positions.cc",
3186-
"src/torque/source-positions.h",
3187-
"src/torque/torque-parser.cc",
3188-
"src/torque/torque-parser.h",
31893208
"src/torque/torque.cc",
3190-
"src/torque/type-oracle.cc",
3191-
"src/torque/type-oracle.h",
3192-
"src/torque/types.cc",
3193-
"src/torque/types.h",
3194-
"src/torque/utils.cc",
3195-
"src/torque/utils.h",
31963209
]
31973210

31983211
deps = [
3199-
":v8_libbase",
3212+
":torque_base",
32003213
"//build/win:default_exe_manifest",
32013214
]
32023215

3203-
configs = [
3204-
":external_config",
3205-
":internal_config_base",
3206-
]
3216+
configs = [ ":internal_config" ]
32073217
}
32083218
}
32093219

@@ -3308,6 +3318,7 @@ if (is_component_build) {
33083318
]
33093319

33103320
public_deps = [
3321+
":torque_base",
33113322
":v8_base",
33123323
":v8_maybe_snapshot",
33133324
]
@@ -3334,6 +3345,7 @@ if (is_component_build) {
33343345
testonly = true
33353346

33363347
public_deps = [
3348+
":torque_base",
33373349
":v8_base",
33383350
":v8_maybe_snapshot",
33393351
]

src/base/macros.h

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -416,4 +416,30 @@ bool is_inbounds(float_t v) {
416416
(kUpperBoundIsMax ? (v <= kUpperBound) : (v < kUpperBound));
417417
}
418418

419+
#ifdef V8_OS_WIN
420+
421+
// Setup for Windows shared library export.
422+
#ifdef BUILDING_V8_SHARED
423+
#define V8_EXPORT_PRIVATE __declspec(dllexport)
424+
#elif USING_V8_SHARED
425+
#define V8_EXPORT_PRIVATE __declspec(dllimport)
426+
#else
427+
#define V8_EXPORT_PRIVATE
428+
#endif // BUILDING_V8_SHARED
429+
430+
#else // V8_OS_WIN
431+
432+
// Setup for Linux shared library export.
433+
#if V8_HAS_ATTRIBUTE_VISIBILITY
434+
#ifdef BUILDING_V8_SHARED
435+
#define V8_EXPORT_PRIVATE __attribute__((visibility("default")))
436+
#else
437+
#define V8_EXPORT_PRIVATE
438+
#endif
439+
#else
440+
#define V8_EXPORT_PRIVATE
441+
#endif
442+
443+
#endif // V8_OS_WIN
444+
419445
#endif // V8_BASE_MACROS_H_

src/globals.h

Lines changed: 0 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -17,32 +17,6 @@
1717
#include "src/base/logging.h"
1818
#include "src/base/macros.h"
1919

20-
#ifdef V8_OS_WIN
21-
22-
// Setup for Windows shared library export.
23-
#ifdef BUILDING_V8_SHARED
24-
#define V8_EXPORT_PRIVATE __declspec(dllexport)
25-
#elif USING_V8_SHARED
26-
#define V8_EXPORT_PRIVATE __declspec(dllimport)
27-
#else
28-
#define V8_EXPORT_PRIVATE
29-
#endif // BUILDING_V8_SHARED
30-
31-
#else // V8_OS_WIN
32-
33-
// Setup for Linux shared library export.
34-
#if V8_HAS_ATTRIBUTE_VISIBILITY
35-
#ifdef BUILDING_V8_SHARED
36-
#define V8_EXPORT_PRIVATE __attribute__((visibility("default")))
37-
#else
38-
#define V8_EXPORT_PRIVATE
39-
#endif
40-
#else
41-
#define V8_EXPORT_PRIVATE
42-
#endif
43-
44-
#endif // V8_OS_WIN
45-
4620
#define V8_INFINITY std::numeric_limits<double>::infinity()
4721

4822
namespace v8 {

src/torque/contextual.h

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -38,13 +38,13 @@ class ContextualVariable {
3838
public:
3939
template <class... Args>
4040
explicit Scope(Args&&... args)
41-
: current_(std::forward<Args>(args)...), previous_(top_) {
42-
top_ = &current_;
41+
: current_(std::forward<Args>(args)...), previous_(Top()) {
42+
Top() = &current_;
4343
}
4444
~Scope() {
4545
// Ensure stack discipline.
46-
DCHECK_EQ(&current_, top_);
47-
top_ = previous_;
46+
DCHECK_EQ(&current_, Top());
47+
Top() = previous_;
4848
}
4949

5050
private:
@@ -61,23 +61,26 @@ class ContextualVariable {
6161
// Access the most recent active {Scope}. There has to be an active {Scope}
6262
// for this contextual variable.
6363
static VarType& Get() {
64-
DCHECK_NOT_NULL(top_);
65-
return *top_;
64+
DCHECK_NOT_NULL(Top());
65+
return *Top();
6666
}
6767

6868
private:
69-
static thread_local VarType* top_;
69+
V8_EXPORT_PRIVATE static VarType*& Top();
7070
};
7171

7272
// Usage: DECLARE_CONTEXTUAL_VARIABLE(VarName, VarType)
7373
#define DECLARE_CONTEXTUAL_VARIABLE(VarName, ...) \
7474
struct VarName \
7575
: v8::internal::torque::ContextualVariable<VarName, __VA_ARGS__> {};
7676

77-
#define DEFINE_CONTEXTUAL_VARIABLE(VarName) \
78-
template <> \
79-
thread_local VarName::VariableType* \
80-
ContextualVariable<VarName, VarName::VariableType>::top_ = nullptr;
77+
#define DEFINE_CONTEXTUAL_VARIABLE(VarName) \
78+
template <> \
79+
V8_EXPORT_PRIVATE VarName::VariableType*& \
80+
ContextualVariable<VarName, VarName::VariableType>::Top() { \
81+
static thread_local VarName::VariableType* top = nullptr; \
82+
return top; \
83+
}
8184

8285
// By inheriting from {ContextualClass} a class can become a contextual variable
8386
// of itself, which is very similar to a singleton.

src/torque/declarable.cc

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,8 @@ std::ostream& operator<<(std::ostream& os, const Generic& g) {
8181
return os;
8282
}
8383

84+
size_t Label::next_id_ = 0;
85+
8486
} // namespace torque
8587
} // namespace internal
8688
} // namespace v8

src/torque/earley-parser.h

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ class ParseResultHolder : public ParseResultHolderBase {
4848
: ParseResultHolderBase(id), value_(std::move(value)) {}
4949

5050
private:
51-
static const TypeId id;
51+
V8_EXPORT_PRIVATE static const TypeId id;
5252
friend class ParseResultHolderBase;
5353
T value_;
5454
};
@@ -157,8 +157,8 @@ class Rule final {
157157
left_hand_side_ = left_hand_side;
158158
}
159159

160-
base::Optional<ParseResult> RunAction(const Item* completed_item,
161-
const LexerResult& tokens) const;
160+
V8_EXPORT_PRIVATE base::Optional<ParseResult> RunAction(
161+
const Item* completed_item, const LexerResult& tokens) const;
162162

163163
private:
164164
Symbol* left_hand_side_ = nullptr;
@@ -178,7 +178,7 @@ class Symbol {
178178
Symbol() : Symbol({}) {}
179179
Symbol(std::initializer_list<Rule> rules) { *this = rules; }
180180

181-
Symbol& operator=(std::initializer_list<Rule> rules);
181+
V8_EXPORT_PRIVATE Symbol& operator=(std::initializer_list<Rule> rules);
182182

183183
bool IsTerminal() const { return rules_.empty(); }
184184
Rule* rule(size_t index) const { return rules_[index].get(); }
@@ -189,8 +189,8 @@ class Symbol {
189189
rules_.back()->SetLeftHandSide(this);
190190
}
191191

192-
base::Optional<ParseResult> RunAction(const Item* item,
193-
const LexerResult& tokens);
192+
V8_EXPORT_PRIVATE base::Optional<ParseResult> RunAction(
193+
const Item* item, const LexerResult& tokens);
194194

195195
private:
196196
std::vector<std::unique_ptr<Rule>> rules_;
@@ -292,7 +292,7 @@ inline base::Optional<ParseResult> Symbol::RunAction(
292292
return item->rule()->RunAction(item, tokens);
293293
}
294294

295-
const Item* RunEarleyAlgorithm(
295+
V8_EXPORT_PRIVATE const Item* RunEarleyAlgorithm(
296296
Symbol* start, const LexerResult& tokens,
297297
std::unordered_set<Item, base::hash<Item>>* processed);
298298

@@ -327,7 +327,7 @@ class Lexer {
327327

328328
Symbol* Pattern(PatternFunction pattern) { return &patterns_[pattern]; }
329329
Symbol* Token(const std::string& keyword) { return &keywords_[keyword]; }
330-
LexerResult RunLexer(const std::string& input);
330+
V8_EXPORT_PRIVATE LexerResult RunLexer(const std::string& input);
331331

332332
private:
333333
PatternFunction match_whitespace_ = [](InputPosition*) { return false; };
@@ -365,10 +365,12 @@ class Grammar {
365365

366366
// Helper functions to define lexer patterns. If they match, they return true
367367
// and advance {pos}. Otherwise, {pos} is unchanged.
368-
static bool MatchChar(int (*char_class)(int), InputPosition* pos);
369-
static bool MatchChar(bool (*char_class)(char), InputPosition* pos);
370-
static bool MatchAnyChar(InputPosition* pos);
371-
static bool MatchString(const char* s, InputPosition* pos);
368+
V8_EXPORT_PRIVATE static bool MatchChar(int (*char_class)(int),
369+
InputPosition* pos);
370+
V8_EXPORT_PRIVATE static bool MatchChar(bool (*char_class)(char),
371+
InputPosition* pos);
372+
V8_EXPORT_PRIVATE static bool MatchAnyChar(InputPosition* pos);
373+
V8_EXPORT_PRIVATE static bool MatchString(const char* s, InputPosition* pos);
372374

373375
// The action MatchInput() produces the input matched by the rule as
374376
// result.

src/torque/implementation-visitor.cc

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,6 @@
77
#include "src/torque/implementation-visitor.h"
88
#include "src/torque/parameter-difference.h"
99

10-
#include "include/v8.h"
11-
1210
namespace v8 {
1311
namespace internal {
1412
namespace torque {

0 commit comments

Comments
 (0)