From 597e0d95fe597f7cc4eb10d5e4a218f134f824d8 Mon Sep 17 00:00:00 2001 From: Luke Date: Wed, 9 Jun 2021 04:43:13 +0100 Subject: [PATCH] LibJS: Only set element in array literal to an empty value if it's null This avoids an unnecessary empty load that immediately gets overridden. For example, `[1,,]` would appear as: [ 0] EnterScope [ 10] LoadImmediate value: [ 28] LoadImmediate value:1 [ 40] Store dst:$1 [ 48] LoadImmediate value: [ 60] Store dst:$2 [ 68] NewArray, elements:[$1,$2] But now appears as: [ 0] EnterScope [ 10] LoadImmediate value:1 [ 28] Store dst:$1 [ 30] LoadImmediate value: [ 48] Store dst:$2 [ 50] NewArray, elements:[$1,$2] --- Userland/Libraries/LibJS/Bytecode/ASTCodegen.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Userland/Libraries/LibJS/Bytecode/ASTCodegen.cpp b/Userland/Libraries/LibJS/Bytecode/ASTCodegen.cpp index c72fd47110..732915e4ca 100644 --- a/Userland/Libraries/LibJS/Bytecode/ASTCodegen.cpp +++ b/Userland/Libraries/LibJS/Bytecode/ASTCodegen.cpp @@ -462,7 +462,6 @@ void ArrayExpression::generate_bytecode(Bytecode::Generator& generator) const { Vector element_regs; for (auto& element : m_elements) { - generator.emit(Value {}); if (element) { element->generate_bytecode(generator); @@ -470,6 +469,8 @@ void ArrayExpression::generate_bytecode(Bytecode::Generator& generator) const TODO(); continue; } + } else { + generator.emit(Value {}); } auto element_reg = generator.allocate_register(); generator.emit(element_reg);