Branch: refs/heads/main
  Home:   https://github.com/WebKit/WebKit
  Commit: 402711f086a1390c86b2b4dcd21989b0f6a305fb
      
https://github.com/WebKit/WebKit/commit/402711f086a1390c86b2b4dcd21989b0f6a305fb
  Author: Alexey Shvayka <[email protected]>
  Date:   2023-10-13 (Fri, 13 Oct 2023)

  Changed paths:
    M Source/JavaScriptCore/bytecompiler/BytecodeGenerator.cpp
    M Source/JavaScriptCore/bytecompiler/BytecodeGenerator.h
    M Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp

  Log Message:
  -----------
  [JSC] Untie emitAwait() from emitYield() to reduce bytecode size of async 
functions
https://bugs.webkit.org/show_bug.cgi?id=263031
<rdar://problem/116825631>

Reviewed by Yusuke Suzuki.

Since async functions are implemented through generators for convenience, 
`await` keyword shares
the implementation with `yield`.

However, unlike `yield` in generators, `await` can't produce a `RETURN` 
completion [1], so this
patch reduces its bytecode size by simplifying ResumeMode checks. The similar 
change is made
to the prelude of async functions as well.

Another reason to separate implementations is that, for spec compliance [2], 
`yield*` in a sync
generator must reuse the received iterator result object, thus the regular 
`yield` would need to
wrap the value [3] in an iterator result object as well, which is unsensible to 
do for async
generators / functions and would bloat their bytecode size.

Also, this change a) removes unconditional (even in case of ignored result) 
move() from emitAwait()
and b) hoists `move(value.get(), generatorValueRegister())` in `yield*` 
implementation to colocate
with ResumeMode checks, making the code easier to follow and emit one less 
move().

No new tests, no behavior change.
This patch offers 5.1% bytecode reduction on JetStream3/async-fs subtest.

[1]: https://tc39.es/ecma262/#await
[2]: https://bugs.webkit.org/show_bug.cgi?id=174756
[3]: https://tc39.es/ecma262/#sec-createiterresultobject

* Source/JavaScriptCore/bytecompiler/BytecodeGenerator.cpp:
(JSC::BytecodeGenerator::emitYield):
(JSC::BytecodeGenerator::emitAwait):
(JSC::BytecodeGenerator::emitDelegateYield):
* Source/JavaScriptCore/bytecompiler/BytecodeGenerator.h:
(JSC::BytecodeGenerator::emitAwait):
* Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp:
(JSC::FunctionNode::emitBytecode):
(JSC::YieldExprNode::emitBytecode):
(JSC::AwaitExprNode::emitBytecode):

Canonical link: https://commits.webkit.org/269321@main


_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to