Bladeren bron

LibJS: Handle "for" statements with empty initializer and updater

Andreas Kling 5 jaren geleden
bovenliggende
commit
6c9d2cfa5e
3 gewijzigde bestanden met toevoegingen van 26 en 2 verwijderingen
  1. 1 1
      Libraries/LibJS/AST.cpp
  2. 1 1
      Libraries/LibJS/Parser.cpp
  3. 24 0
      Libraries/LibJS/Tests/for-basic.js

+ 1 - 1
Libraries/LibJS/AST.cpp

@@ -126,7 +126,7 @@ Value ForStatement::execute(Interpreter& interpreter) const
 {
     RefPtr<BlockStatement> wrapper;
 
-    if (m_init->is_variable_declaration() && static_cast<const VariableDeclaration*>(m_init.ptr())->declaration_type() != DeclarationType::Var) {
+    if (m_init && m_init->is_variable_declaration() && static_cast<const VariableDeclaration*>(m_init.ptr())->declaration_type() != DeclarationType::Var) {
         wrapper = create_ast_node<BlockStatement>();
         interpreter.enter_scope(*wrapper, {}, ScopeType::Block);
     }

+ 1 - 1
Libraries/LibJS/Parser.cpp

@@ -612,7 +612,7 @@ NonnullRefPtr<ForStatement> Parser::parse_for_statement()
 
     RefPtr<Expression> update;
     switch (m_current_token.type()) {
-    case TokenType::Semicolon:
+    case TokenType::ParenClose:
         break;
     default:
         update = parse_expression(0);

+ 24 - 0
Libraries/LibJS/Tests/for-basic.js

@@ -0,0 +1,24 @@
+function assert(x) { if (!x) throw 1; }
+
+try {
+    var a = [];
+    for (var i = 0; i < 3; ++i) {
+        a.push(i);
+    }
+    assert(a.length === 3);
+    assert(a[0] === 0);
+    assert(a[1] === 1);
+    assert(a[2] === 2);
+
+    for (; a.length < 6;) {
+        a.push('x');
+    }
+    assert(a.length === 6);
+    assert(a[3] === 'x');
+    assert(a[4] === 'x');
+    assert(a[5] === 'x');
+
+    console.log("PASS");
+} catch (e) {
+    console.log("FAIL: " + e);
+}