Skip to content

Commit 12f601c

Browse files
mi-acV8-internal LUCI CQ
authored andcommitted
Make disposable-variable generators more expressive
This turns the existing disposable-variable generators into new-style stubs that enable more expressive code generation in the bodies of the generated objects. Bug: 446632644 Change-Id: Ife11999aa61d133c15232bca58e30deb525d880d Reviewed-on: https://chrome-internal-review.googlesource.com/c/v8/fuzzilli/+/8654476 Reviewed-by: Matthias Liedtke <[email protected]> Commit-Queue: Michael Achenbach <[email protected]>
1 parent 165adb7 commit 12f601c

File tree

1 file changed

+60
-26
lines changed

1 file changed

+60
-26
lines changed

Sources/Fuzzilli/CodeGen/CodeGenerators.swift

Lines changed: 60 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,54 @@
1212
// See the License for the specific language governing permissions and
1313
// limitations under the License.
1414

15+
// Generator stubs for disposable and async-disposable variables.
16+
func disposableVariableGeneratorStubs(
17+
inContext contextRequirement : Context,
18+
withSymbol symbolProperty : String,
19+
genDisposableVariable : @escaping (ProgramBuilder, Variable) -> Void) -> [GeneratorStub] {
20+
return [
21+
GeneratorStub(
22+
"DisposableObjectLiteralBeginGenerator",
23+
inContext: .single(contextRequirement),
24+
provides: [.objectLiteral]
25+
) { b in
26+
// Ensure we have the desired symbol below.
27+
b.createSymbolProperty(symbolProperty)
28+
b.emit(BeginObjectLiteral())
29+
},
30+
GeneratorStub(
31+
"DisposableObjectLiteralComputedMethodBeginGenerator",
32+
inContext: .single(.objectLiteral),
33+
provides: [.javascript, .subroutine, .method]
34+
) { b in
35+
// It should be safe to assume that we find at least the
36+
// desired symbol we created above.
37+
let symbol = b.randomVariable(forUseAs: .jsSymbol)
38+
let parameters = b.randomParameters()
39+
b.setParameterTypesForNextSubroutine(parameters.parameterTypes)
40+
b.emit(
41+
BeginObjectLiteralComputedMethod(
42+
parameters: parameters.parameters),
43+
withInputs: [symbol])
44+
},
45+
GeneratorStub(
46+
"DisposableObjectLiteralComputedMethodEndGenerator",
47+
inContext: .single([.javascript, .subroutine, .method]),
48+
provides: [.objectLiteral]
49+
) { b in
50+
b.maybeReturnRandomJsVariable(0.9)
51+
b.emit(EndObjectLiteralComputedMethod())
52+
},
53+
GeneratorStub(
54+
"DisposableObjectLiteralEndGenerator",
55+
inContext: .single(.objectLiteral)
56+
) { b in
57+
let disposableVariable = b.emit(EndObjectLiteral()).output
58+
genDisposableVariable(b, disposableVariable)
59+
},
60+
]
61+
}
62+
1563
//
1664
// Code generators.
1765
//
@@ -423,34 +471,20 @@ public let CodeGenerators: [CodeGenerator] = [
423471
]),
424472

425473
CodeGenerator(
426-
"DisposableVariableGenerator", inContext: .single(.subroutine), inputs: .one
427-
) { b, val in
428-
assert(b.context.contains(.subroutine))
429-
let dispose = b.createSymbolProperty("dispose")
430-
let disposableVariable = b.buildObjectLiteral { obj in
431-
obj.addProperty("value", as: val)
432-
obj.addComputedMethod(dispose, with: .parameters(n: 0)) { args in
433-
b.maybeReturnRandomJsVariable(0.9)
434-
}
435-
}
436-
b.loadDisposableVariable(disposableVariable)
437-
},
474+
"DisposableVariableGenerator",
475+
disposableVariableGeneratorStubs(
476+
inContext: .subroutine,
477+
withSymbol: "dispose") { b, variable in
478+
b.loadDisposableVariable(variable)
479+
}),
438480

439481
CodeGenerator(
440-
"AsyncDisposableVariableGenerator", inContext: .single(.asyncFunction),
441-
inputs: .one
442-
) { b, val in
443-
assert(b.context.contains(.asyncFunction))
444-
let asyncDispose = b.createSymbolProperty("asyncDispose")
445-
let asyncDisposableVariable = b.buildObjectLiteral { obj in
446-
obj.addProperty("value", as: val)
447-
obj.addComputedMethod(asyncDispose, with: .parameters(n: 0)) {
448-
args in
449-
b.maybeReturnRandomJsVariable(0.9)
450-
}
451-
}
452-
b.loadAsyncDisposableVariable(asyncDisposableVariable)
453-
},
482+
"AsyncDisposableVariableGenerator",
483+
disposableVariableGeneratorStubs(
484+
inContext: .asyncFunction,
485+
withSymbol: "asyncDispose") { b, variable in
486+
b.loadAsyncDisposableVariable(variable)
487+
}),
454488

455489
CodeGenerator(
456490
"ObjectLiteralGenerator",

0 commit comments

Comments
 (0)