summaryrefslogtreecommitdiff
path: root/src/qml/compiler/qv4codegen.cpp
Commit message (Collapse)AuthorAgeFilesLines
...
* | Simplify Push and PopContext instructionsLars Knoll2018-05-231-1/+1
| | | | | | | | | | | | | | | | | | There's no need for a temp register to store the old context in, as PopContext can simply retrieve the old context from the current one. Change-Id: Ife9cfdff7fa8e47fc71e844a7798de88dbc79e26 Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
* | Partial support for calling iterator.return when break a for-of loopLars Knoll2018-05-141-3/+13
| | | | | | | | | | | | | | | | | | This will only work for non labelled break statements that don't break an outer loop as well. It also still doesn't work when an exception is thrown within the loop. Change-Id: Ie7cee7094ce2c51cdaa52270bbb16bc83b1e208f Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
* | Call iterator.return when required in destructuring assignmentsLars Knoll2018-05-141-4/+30
| | | | | | | | | | | | | | | | Array destructuring assignments require a call to iterator.return if the iterator hasn't been exhausted during destructuring. Change-Id: I39fe4bc01bef6fb2ad3bda92caf6779fbbddc8e2 Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
* | Refactor InteratorNext instructionLars Knoll2018-05-141-7/+6
| | | | | | | | | | | | | | | | | | | | The instruction now writes the value into a stack slot, and returns the done state in the accumulator. This should make it easier to implement the IteratorClose functionality required by the spec. Change-Id: I8cc497c54b0d044bd3c68a5a1b774eea8b2740ef Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
* | Implement support for destructuring of rest elementsLars Knoll2018-05-141-12/+15
| | | | | | | | | | | | | | "var [x, ...y] = array" now works as intended. Change-Id: I45238f27f468d0b0e14dc0e931c55c4f40043690 Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
* | Fix array destructuringLars Knoll2018-05-131-8/+26
| | | | | | | | | | | | | | | | Array destructuring should use iterator objects, not integer indexes. Change-Id: I769bb1d63246da6bc45233f7a6e9a8e5ddc53a4d Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
* | Add instructions to simplify for-of loopsLars Knoll2018-05-131-13/+10
| | | | | | | | | | | | | | | | | | | | | | Added an IteratorNext instruction to fetch the next iteration value (empty if the iterator is done). This will also help to implement array destructuring without requiring huge amounts of byte code. Change-Id: If96c1e81471e5e2b0b7b2af122238d87741aa371 Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
* | Give for loops a per-iteration context as wellLars Knoll2018-05-111-0/+4
| | | | | | | | | | | | | | | | Regular for loops also have a per iteration context for lexically declared variables as well. Change-Id: I35cb58bfb198c7dc32d70f41ea0ced7ddefcc37e Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
* | Give case blocks a proper scopeLars Knoll2018-05-111-0/+2
| | | | | | | | | | Change-Id: Id307c0426e1c9326ac085cebda71934cb5e612e0 Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
* | Give for loops a proper block scope for it's lexically declared varsLars Knoll2018-05-111-0/+2
| | | | | | | | | | Change-Id: I71c40d1d061ac3c1c623dbbf8f7967c9ec35c082 Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
* | Unify AST for the different 'for' statementsLars Knoll2018-05-111-34/+5
| | | | | | | | | | Change-Id: I70ca83b0ce933d64dad4984a236e48592e989742 Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
* | Improve for-in and for-of supportLars Knoll2018-05-111-56/+69
| | | | | | | | | | | | | | | | | | | | | | | | Create a Block scope per iteration as defined in the ES spec. So closures created inside the loop will remember the iteration variable at that loop iteration. Add support for destructuring of the left hand side expression or declaration. Change-Id: Id06ef94e2a4b93646827da4f6ce922eb436e5a31 Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
* | Unify ForeachStatement and LocalForeachStatement in the ASTLars Knoll2018-05-111-30/+11
| | | | | | | | | | | | | | | | This saves quite some duplicated code, but requires a bit of care when iterating over the AST. Change-Id: Ic530de4be8b36b4079c9d544b4b77982c3b8be60 Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
* | Support destructuring inside catch()Lars Knoll2018-05-111-6/+0
| | | | | | | | | | Change-Id: Ib60b56ac6a7111446e01235564a4cf92ad8ad025 Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
* | Ensure we have a lexical scope for global codeLars Knoll2018-05-111-0/+13
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This requires a bit more work than simply pushing a new BlockContext for the lexically declared variables, as eval() and the Function constructor operate on the global scope (including the lexically declared names). To fix this introduce Push/PopScriptContext instructions, that create a BlockContext for the lexically declared vars and pushes that one as a global script context that eval and friends use. Change-Id: I0fd0b0f682f82e250545e874fe93978449fe5e46 Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
* | Don't cast an ExpressionNode to a StatementLars Knoll2018-05-091-3/+3
| | | | | | | | | | Change-Id: Ieb30d5345e56d6a2bb70320bf76eabcb9457e0f3 Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
* | Add some basic support for for-of loopsLars Knoll2018-05-091-3/+13
| | | | | | | | | | | | | | | | | | | | | | | | | | The support is basically at the same level as for for-in at the moment. Currently unimplemented: * Destructuring * Proper lexical scoping * calling iterator.throw()/return() when required Change-Id: If193ce0b054c4315fc16b7e174334a31b2730dcf Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
* | Unify code paths for the two Foreach variantsLars Knoll2018-05-041-59/+39
| | | | | | | | | | | | | | They are mostly the same except for initialization. Change-Id: Idd1c0af1fc4fa3e478aeba7a7d45617949a2f239 Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
* | Reformulate for-in in terms of iteratorsLars Knoll2018-05-041-7/+9
| | | | | | | | | | | | | | | | | | Currently implemented for one of the two for-in variants, the follow-up patch will unify the code paths for the other variant with it. Change-Id: Ib0d1a0805018787530880b0e36d7ffc91e76a719 Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
* | Add Generator supportLars Knoll2018-05-031-16/+50
| | | | | | | | | | | | | | | | | | | | | | | | | | Add support for ES6 generators. Those are currently always executed in the interpreter (we never JIT them), to simplify the initial implementation. Most functionality, except for 'yield *' expressions are supported. 'yield *' will have to wait until we support for(... of ...) Change-Id: I7c059d1e3b301cbcb79e3746b4bec346738fd426 Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
* | Check for errors after evaluating an expressionLars Knoll2018-05-021-1/+4
| | | | | | | | | | Change-Id: I271dfbaca99587019b1e37a031a345dd46b00ec4 Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
* | Add more checks for parse errorsLars Knoll2018-05-021-5/+20
| | | | | | | | | | Change-Id: Ie341340dfad1c8ef59a59e419465521f7d777990 Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
* | Fix failing assertion with getter and computed property namesLars Knoll2018-05-021-2/+7
| | | | | | | | | | Change-Id: Ie2929f0c20d8a6a2284238c15178dbcd5312e3b7 Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
* | Fix failing assertions when destructuringLars Knoll2018-05-021-2/+6
| | | | | | | | | | Change-Id: I1ee33969486c1c522b18e54410265716f222f6eb Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
* | Cleanup handling of with() statementsLars Knoll2018-05-021-5/+6
| | | | | | | | | | | | | | | | | | | | | | Add a CompilerContext for with, whose only purpose it is to trigger variable lookup by name. This avoids looking up variables declared inside the with() {} block by name and we do not lookup variables outside the with block by name neither anymore. Change-Id: I52e9fb2daa9601f9e5102714c002dc506ad5ed23 Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
* | Rework catch context handlingLars Knoll2018-05-021-2/+0
| | | | | | | | | | | | | | | | | | | | | | | | Remove the need for a specialized catch context, instead use a regular block context, that also captures the catched variable. This also removes the need to do lookups by name inside a catch expression. Change-Id: I8b037add7f423922e2a76b4c0da646ca7e25813a Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
* | Add support for proper lexical scopingLars Knoll2018-05-021-43/+46
| | | | | | | | | | | | | | | | | | | | | | | | | | This is still to some extend work in progress as lexically scoped for loops won't yet do the right thing. let and const variables are still accessible before they are declared, and the global scope doesn't yet have a proper context for lexically declared variables. Change-Id: Ie39f74a8fccdaead437fbf07f9fc228a444c26ed Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
* | Make sure we call Codegen::defineFunction with proper argumentsLars Knoll2018-05-021-1/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | So far, when instantiating QML bindings, the node parameter could be the same or a child of the body. This will break badly when we introduce lexical scopeing as that node could be an AST::Block that opens it's own context. Changing this requires some smaller adjustments to our autotests, as error locations will now be slightly different (pointing to the beginning of the binding, not the beginning of the RHS of the binding). Change-Id: I2c536a4fe6d8b549a138cc7967ef034eb2523f3b Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
* | Split out the generation of indices for locals and registersLars Knoll2018-05-021-5/+7
| | | | | | | | | | Change-Id: I0e98ccba9ae3026cd8bfdc4cae100f280b5aa22c Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
* | Refactor variable resolvingLars Knoll2018-05-021-143/+30
| | | | | | | | | | | | | | | | | | | | Move variable resolving into the context, and avoid creating ExecutionContext's whereever we can. This prepares things for block scoping, where this becomes rather important to be able to achieve decent performance. Change-Id: Idf3d3c12cf348a2c3da01989c26c8529ceb36c12 Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
* | Rename the CompilationMode enum to ContextTypeLars Knoll2018-05-021-11/+11
| | | | | | | | | | | | | | | | | | And make it an enum class. The new name fits better, as it's mainly used to determine the type of the context when parsing. Also already added the 'Block' value that will be needed. Change-Id: I70d963b6a0b22db1a3c607cce6bdd2054b29e000 Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
* | Properly set names of most anonymous functionsLars Knoll2018-05-021-3/+13
| | | | | | | | | | | | | | | | In ES6, anonymous functions assigned to a variable/property with a known name, inherit the name of that variable/property. Change-Id: I79479b9358b24d610e3e696eb19fe0ec4aee15d1 Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
* | Fix crashes when parsing functions with no parametersSimon Hausmann2018-05-021-1/+1
| | | | | | | | | | | | | | | | | | | | Commit da5fffbd34d8be68f8ee4c649881dbb673c9c0a5 introduced deferencing of the formals parameter list that can be a null pointer if the declared function has no parameters. Change-Id: Id7dce0f78b16266e672f0ae430ee4f979de5734d Reviewed-by: Erik Verbruggen <erik.verbruggen@qt.io> Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
* | Support destructuring assignmentsLars Knoll2018-04-271-13/+32
| | | | | | | | | | | | | | | | Not everything works yet, but basic destructuring assignments do. Change-Id: I5f74691fd6458092ecfde9d1a8a802f99fc57b9e Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
* | Add support for destructuring variable declarationsLars Knoll2018-04-271-21/+20
| | | | | | | | | | Change-Id: Ia7f894fb61cfa760e253963ab4815d98103cfd9b Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
* | Use a PatternElement for VariableDeclarationsLars Knoll2018-04-271-12/+6
| | | | | | | | | | | | | | Required to get proper destructuring working. Change-Id: I99fc20a9f1bace1fe3981d88ce5466f9c8d98245 Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
* | Rework the AST for Literals and destructuring expressionsLars Knoll2018-04-271-44/+57
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Array/ObjectLiterals and destructuring expressions are syntactically very similar. In some cases (when using a destructuring expression as the lhs of an assigment), the parser needs to convert the literal into a destructuring expression. To support these, use the same data structures for both in the AST. Those Patterns can be converted with little additional work from a Literal to an AssignmentPattern and be used in all places where we need destructuring in addition to literals. Change-Id: I177599b46eab0f6e8cb2a40c3b3b11ed00a07d6a Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
* | Rename Array/ObjectLiteral to Array/ObjectPattern in the ASTLars Knoll2018-04-271-2/+2
| | | | | | | | | | | | | | | | | | | | | | | | To get a consistent representation in the AST, we need to unify the AST that is generated by theObjectLiterals, ObjectBindingPattern and ObjectAssignmentPattern rules in the grammar. Like this we can avoid having to reparse part of the source code, and instead replace this with consistency checks once we know which of the three grammars are supposed to apply. Change-Id: Ib90f521f9595db6bcad446e40de9b912bab3da7c Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
* | Add support for 'class' to the ASTLars Knoll2018-04-271-0/+6
| | | | | | | | | | Change-Id: I2a9e8fb847dfa45ca77ee43e14f39f2b2def5792 Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
* | Added support for generator functions and yield expressions to the ASTLars Knoll2018-04-271-0/+10
| | | | | | | | | | | | | | | | | | Some smaller changes to the codegen are included as well to ensure that we catch all uses of generators and properly throw an unimplemented error on them for now. Change-Id: Ib915a0e862e128644ff00dfe989507783c912c66 Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
* | Add support for '...' in arguments lists to the ASTLars Knoll2018-04-271-1/+6
| | | | | | | | | | | | | | No support in the codegen yet. Change-Id: I9998d7abae086660fc0457c65b6d9050933a428f Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
* | Add support for ... in ArrayLiterals to the ASTLars Knoll2018-04-271-0/+4
| | | | | | | | | | | | | | The codegen still throws a syntax error for now. Change-Id: I8134b27d6153f6d6df81a9bafc7ae9d573085b73 Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
* | Implement support for the ** and **= operatorsLars Knoll2018-04-261-0/+11
| | | | | | | | | | Change-Id: I58a21e70fdd040175b52465d6ba52e7fceaf6398 Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
* | Add support for 'super' and 'new.target' to the ASTLars Knoll2018-04-261-0/+20
| | | | | | | | | | | | | | Codegen will still throw a Syntax error on it though. Change-Id: I292dd166ad8cb4a62f2bcfa9637bdc76cf95bb51 Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
* | Add partial support for computed property namesLars Knoll2018-04-261-4/+27
| | | | | | | | | | | | | | | | Computed property names currently work in object literals and destructuring arguments. Change-Id: I9dc5bc61b45139ef1836072695ea2fe1ce4994ae Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
* | Don't error on duplicate property names in object literalsLars Knoll2018-04-261-15/+3
| | | | | | | | | | | | | | | | | | | | | | | | This has been relaxed from ES5. In ES8 this is actually allowed even in strict mode. According to the spec we are to evaluate all rhs expressions, but assign the last one used in the object literal. The spec probably required this relaxation to be able to handle computed property names. Change-Id: Ia1b02010b7541946029951b36e5457a07fdee818 Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
* | Fix length property of Function objectsLars Knoll2018-04-261-0/+3
| | | | | | | | | | | | | | | | | | | | | | According to ES6, the length property is the number of required arguments, ie. the number of arguments until the first arg that has adefault parameter. Also fix a crash when parsing a parameterlist with a trailing comma. Change-Id: I4f6b2be4feae7b513388be66b43b160bb3cc77f1 Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
* | Fix some bugs in binding destructuringLars Knoll2018-04-261-3/+9
| | | | | | | | | | Change-Id: I4b18a88e443f3b263cbb1e2b5ca1ebbd353afa98 Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
* | Fix an assertion in the codegenLars Knoll2018-04-251-1/+1
| | | | | | | | | | | | | | | | If there is no name for the binding, we need to store it's value as a temp on the stack for further destructuring. Change-Id: Ibf8651e5aed4f45f2ca5f2d2d3ddeb8fc60b5f9f Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
* | Bring JS grammar in line with ES7 specLars Knoll2018-04-251-83/+14
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This basically updates all grammar rules in the qqmljs.g file to be in line with the ES7 specification. Some special handling for the lookahead rules appearing in the spec was needed and is implemented through empty lookahead rules in the grammar, that might push an additional token into the token stream. Renamed some classes in the AST to be in line with the names used in ES7, and removed some other ones (SourceElements) that are no longer used. The ES7 grammar rules contain lots of variations of the base rules (with In/Return/Yield/Default suffixes). With the exception of the In and Default rules, these are implemented through state tracking in the parser and lexer. Change-Id: I4017d97cd050ed816c1dad11833e882cba30801a Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>