Skip to content

Commit 028582b

Browse files
o-v8-internal-scoped@luci-project-accounts.iam.gserviceaccount.com
authored andcommitted
[js, modules] Allow TLA
Allow top level await in modules by adding .async to beginBundleModule. Drive-By: Rename .asyncFunction to .async Fixed: 521338444 Change-Id: I3c8bac11b6f41bf2565596b8c3ef2f79161e198f Reviewed-on: https://chrome-internal-review.googlesource.com/c/v8/fuzzilli/+/9362884 Reviewed-by: Matthias Liedtke <mliedtke@google.com> Commit-Queue: Olivier Flückiger <olivf@google.com> Auto-Submit: Olivier Flückiger <olivf@google.com>
1 parent 9d8137c commit 028582b

5 files changed

Lines changed: 31 additions & 32 deletions

File tree

Sources/Fuzzilli/CodeGen/CodeGenerators.swift

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,7 @@ func makeForInOfLoopGenerator(
144144

145145
// 'await using' requires an async function context, even inside a standard (non-async) for-of loop.
146146
let context: GeneratorStub.ContextRequirement =
147-
(isAsyncIteration || requiresAsyncContext) ? .single(.asyncFunction) : .single(.javascript)
147+
(isAsyncIteration || requiresAsyncContext) ? .single(.async) : .single(.javascript)
148148

149149
let inputs: GeneratorStub.Inputs
150150
switch type {
@@ -819,7 +819,7 @@ public let CodeGenerators: [CodeGenerator] = [
819819
CodeGenerator(
820820
"AsyncDisposableObjVariableGenerator",
821821
disposableObjVariableGeneratorStubs(
822-
inContext: .asyncFunction,
822+
inContext: .async,
823823
withSymbol: "asyncDispose"
824824
) { b, variable in
825825
b.loadAsyncDisposableVariable(variable)
@@ -837,7 +837,7 @@ public let CodeGenerators: [CodeGenerator] = [
837837
CodeGenerator(
838838
"AsyncDisposableClassVariableGenerator",
839839
disposableClassVariableGeneratorStubs(
840-
inContext: .asyncFunction,
840+
inContext: .async,
841841
withSymbol: "asyncDispose"
842842
) { b, variable in
843843
b.loadAsyncDisposableVariable(variable)
@@ -1769,7 +1769,7 @@ public let CodeGenerators: [CodeGenerator] = [
17691769
"AsyncFunctionGenerator",
17701770
[
17711771
GeneratorStub(
1772-
"AsyncFunctionBeginGenerator", provides: [.javascript, .subroutine, .asyncFunction]
1772+
"AsyncFunctionBeginGenerator", provides: [.javascript, .subroutine, .async]
17731773
) { b in
17741774
let (randomParameters, defaultValues) = b.randomParameters()
17751775
.withRandomDefaultParameters(
@@ -1787,7 +1787,7 @@ public let CodeGenerators: [CodeGenerator] = [
17871787
},
17881788
GeneratorStub(
17891789
"AsyncFunctionEndGenerator",
1790-
inContext: .single([.javascript, .subroutine, .asyncFunction])
1790+
inContext: .single([.javascript, .subroutine, .async])
17911791
) { b in
17921792
b.await(b.randomJsVariable())
17931793
b.doReturn(b.randomJsVariable())
@@ -1803,7 +1803,7 @@ public let CodeGenerators: [CodeGenerator] = [
18031803
[
18041804
GeneratorStub(
18051805
"AsyncArrowFunctionBeginGenerator",
1806-
provides: [.javascript, .asyncFunction]
1806+
provides: [.javascript, .async]
18071807
) { b in
18081808
let (randomParameters, defaultValues) = b.randomParameters()
18091809
.withRandomDefaultParameters(
@@ -1820,14 +1820,14 @@ public let CodeGenerators: [CodeGenerator] = [
18201820
},
18211821
GeneratorStub(
18221822
"AsyncArrowFunctionAwaitGenerator",
1823-
inContext: .single([.javascript, .asyncFunction]),
1824-
provides: [.javascript, .asyncFunction]
1823+
inContext: .single([.javascript, .async]),
1824+
provides: [.javascript, .async]
18251825
) { b in
18261826
b.await(b.randomJsVariable())
18271827
},
18281828
GeneratorStub(
18291829
"AsyncArrowFunctionEndGenerator",
1830-
inContext: .single([.javascript, .asyncFunction])
1830+
inContext: .single([.javascript, .async])
18311831
) { b in
18321832
// These are "typically" used as arguments, so we don't directly generate a call operation here.
18331833
b.doReturn(b.randomJsVariable())
@@ -1842,7 +1842,7 @@ public let CodeGenerators: [CodeGenerator] = [
18421842
[
18431843
GeneratorStub(
18441844
"AsyncGeneratorFunctionBeginGenerator",
1845-
provides: [.javascript, .subroutine, .asyncFunction, .generatorFunction]
1845+
provides: [.javascript, .subroutine, .async, .generatorFunction]
18461846
) { b in
18471847
let (randomParameters, defaultValues) = b.randomParameters()
18481848
.withRandomDefaultParameters(
@@ -1861,7 +1861,7 @@ public let CodeGenerators: [CodeGenerator] = [
18611861
},
18621862
GeneratorStub(
18631863
"AsyncGeneratorFunctionEndGenerator",
1864-
inContext: .single([.javascript, .subroutine, .generatorFunction, .asyncFunction])
1864+
inContext: .single([.javascript, .subroutine, .generatorFunction, .async])
18651865
) { b in
18661866
b.await(b.randomJsVariable())
18671867
if probability(0.5) {
@@ -2373,7 +2373,7 @@ public let CodeGenerators: [CodeGenerator] = [
23732373
b.yieldEach(val)
23742374
},
23752375

2376-
CodeGenerator("AwaitGenerator", inContext: .single(.asyncFunction), inputs: .one) {
2376+
CodeGenerator("AwaitGenerator", inContext: .single(.async), inputs: .preferred(.jsPromise)) {
23772377
b, val in
23782378
b.await(val)
23792379
},

Sources/Fuzzilli/Compiler/Compiler.swift

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1651,8 +1651,7 @@ public class JavaScriptCompiler {
16511651
)
16521652

16531653
case .awaitExpression(let awaitExpression):
1654-
// TODO await is also allowed at the top level of a module
1655-
if !contextAnalyzer.context.contains(.asyncFunction) {
1654+
if !contextAnalyzer.context.contains(.async) {
16561655
throw CompilerError.invalidNodeError(
16571656
"`await` is currently only supported in async functions")
16581657
}

Sources/Fuzzilli/FuzzIL/Context.swift

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ public struct Context: OptionSet, Hashable, CaseIterable {
1818
.javascript,
1919
.subroutine,
2020
.generatorFunction,
21-
.asyncFunction,
21+
.async,
2222
.method,
2323
.classMethod,
2424
.loop,
@@ -51,7 +51,7 @@ public struct Context: OptionSet, Hashable, CaseIterable {
5151
public static let generatorFunction = Context(rawValue: 1 << 2)
5252
// Inside an async function definition.
5353
// This for example means that `await` is allowed.
54-
public static let asyncFunction = Context(rawValue: 1 << 3)
54+
public static let async = Context(rawValue: 1 << 3)
5555
// Inside a method.
5656
// This for example means that access to `super` is allowed.
5757
public static let method = Context(rawValue: 1 << 4)
@@ -102,8 +102,8 @@ extension Context: CustomStringConvertible {
102102
if self.contains(.generatorFunction) {
103103
strings.append(".generatorFunction")
104104
}
105-
if self.contains(.asyncFunction) {
106-
strings.append(".asyncFunction")
105+
if self.contains(.async) {
106+
strings.append(".async")
107107
}
108108
if self.contains(.method) {
109109
strings.append(".method")

Sources/Fuzzilli/FuzzIL/JsOperations.swift

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -371,7 +371,7 @@ final class LoadAsyncDisposableVariable: JsOperation {
371371
override var opcode: Opcode { .loadAsyncDisposableVariable(self) }
372372

373373
init() {
374-
super.init(numInputs: 1, numOutputs: 1, requiredContext: [.javascript, .asyncFunction])
374+
super.init(numInputs: 1, numOutputs: 1, requiredContext: [.javascript, .async])
375375
}
376376
}
377377

@@ -382,7 +382,7 @@ final class CreateNamedAsyncDisposableVariable: JsOperation {
382382

383383
init(_ name: String) {
384384
self.variableName = name
385-
super.init(numInputs: 1, numOutputs: 1, requiredContext: [.javascript, .asyncFunction])
385+
super.init(numInputs: 1, numOutputs: 1, requiredContext: [.javascript, .async])
386386
}
387387
}
388388

@@ -1469,7 +1469,7 @@ final class BeginAsyncFunction: BeginAnyNamedFunction {
14691469
init(parameters: Parameters, functionName: String?) {
14701470
super.init(
14711471
parameters: parameters, functionName: functionName,
1472-
contextOpened: [.javascript, .subroutine, .asyncFunction])
1472+
contextOpened: [.javascript, .subroutine, .async])
14731473
}
14741474
}
14751475
final class EndAsyncFunction: EndAnyFunction {
@@ -1482,7 +1482,7 @@ final class BeginAsyncArrowFunction: BeginAnyFunction {
14821482

14831483
init(parameters: Parameters) {
14841484
super.init(
1485-
parameters: parameters, contextOpened: [.javascript, .subroutine, .asyncFunction])
1485+
parameters: parameters, contextOpened: [.javascript, .subroutine, .async])
14861486
}
14871487
}
14881488
final class EndAsyncArrowFunction: EndAnyFunction {
@@ -1496,7 +1496,7 @@ final class BeginAsyncGeneratorFunction: BeginAnyNamedFunction {
14961496
init(parameters: Parameters, functionName: String?) {
14971497
super.init(
14981498
parameters: parameters, functionName: functionName,
1499-
contextOpened: [.javascript, .subroutine, .asyncFunction, .generatorFunction])
1499+
contextOpened: [.javascript, .subroutine, .async, .generatorFunction])
15001500
}
15011501
}
15021502
final class EndAsyncGeneratorFunction: EndAnyFunction {
@@ -1592,7 +1592,7 @@ final class Await: JsOperation {
15921592
init() {
15931593
super.init(
15941594
numInputs: 1, numOutputs: 1, attributes: [],
1595-
requiredContext: [.javascript, .asyncFunction])
1595+
requiredContext: [.javascript, .async])
15961596
}
15971597
}
15981598

@@ -2415,7 +2415,7 @@ final class ForLoop: JsOperation {
24152415
super.init(
24162416
numInputs: 1, numInnerOutputs: numInnerOutputs,
24172417
attributes: [.isBlockStart, .propagatesSurroundingContext],
2418-
requiredContext: isAsync ? [.javascript, .asyncFunction] : [.javascript],
2418+
requiredContext: isAsync ? [.javascript, .async] : [.javascript],
24192419
contextOpened: [.loop])
24202420
}
24212421

@@ -3053,7 +3053,7 @@ final class BeginBundleModule: JsOperation {
30533053
self.moduleName = moduleName
30543054
super.init(
30553055
attributes: .isBlockStart, requiredContext: [.bundle],
3056-
contextOpened: [.moduleTopLevel, .javascript])
3056+
contextOpened: [.moduleTopLevel, .javascript, .async])
30573057
}
30583058
}
30593059

@@ -3120,7 +3120,7 @@ final class BeginBundleModuleEntryPoint: JsOperation {
31203120
init() {
31213121
super.init(
31223122
attributes: .isBlockStart, requiredContext: [.bundle],
3123-
contextOpened: [.moduleTopLevel, .javascript])
3123+
contextOpened: [.moduleTopLevel, .javascript, .async])
31243124
}
31253125
}
31263126

Tests/FuzzilliTests/AnalyzerTest.swift

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -98,18 +98,18 @@ class AnalyzerTests: XCTestCase {
9898

9999
XCTAssertEqual(b.context, .javascript)
100100
b.buildAsyncFunction(with: .parameters(n: 2)) { _ in
101-
XCTAssertEqual(b.context, [.javascript, .subroutine, .asyncFunction])
101+
XCTAssertEqual(b.context, [.javascript, .subroutine, .async])
102102
let v3 = b.loadInt(0)
103103
b.buildPlainFunction(with: .parameters(n: 3)) { _ in
104104
XCTAssertEqual(b.context, [.javascript, .subroutine])
105105
}
106-
XCTAssertEqual(b.context, [.javascript, .subroutine, .asyncFunction])
106+
XCTAssertEqual(b.context, [.javascript, .subroutine, .async])
107107
b.await(v3)
108108
b.buildAsyncGeneratorFunction(with: .parameters(n: 2)) { _ in
109109
XCTAssertEqual(
110-
b.context, [.javascript, .subroutine, .asyncFunction, .generatorFunction])
110+
b.context, [.javascript, .subroutine, .async, .generatorFunction])
111111
}
112-
XCTAssertEqual(b.context, [.javascript, .subroutine, .asyncFunction])
112+
XCTAssertEqual(b.context, [.javascript, .subroutine, .async])
113113
}
114114

115115
let _ = b.finalize()
@@ -164,7 +164,7 @@ class AnalyzerTests: XCTestCase {
164164
cls.addInstanceMethod("m", with: .parameters(n: 2)) { _ in
165165
XCTAssertEqual(b.context, [.javascript, .subroutine, .method, .classMethod])
166166
b.buildAsyncFunction(with: .parameters(n: 2)) { _ in
167-
XCTAssertEqual(b.context, [.javascript, .subroutine, .asyncFunction])
167+
XCTAssertEqual(b.context, [.javascript, .subroutine, .async])
168168
}
169169
XCTAssertEqual(b.context, [.javascript, .subroutine, .method, .classMethod])
170170
}

0 commit comments

Comments
 (0)