aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/compiler/qv4codegen.cpp
Commit message (Collapse)AuthorAgeFilesLines
* Only create CallContext objects for bindings that might be signal handlersLars Knoll2018-04-261-3/+8
| | | | | | | | | | | | | | Creating the callcontext for all bindings causes a 15% performance regression in both of the moving images benchmarks of qmlbench. But in most cases, we know that a binding can't be a signal handler, as those always have to start with 'on'. Take this into account and avoid creating the context for most binding expressions. Task-number: QTBUG-67782 Task-number: QTBUG-67783 Change-Id: I9a25cb916e374c7d03693e49646ca28853c6ba54 Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
* Fix crashes when parsing destructuring expressionsLars Knoll2018-04-161-1/+2
| | | | | | | | | | x = [y] = z would crash because [y] is a literal and not a valid lvalue in ES5, something our parser didn't catch correctly. Change-Id: I0d7abd9b3f812f1de61c77dccfab5d1778dac793 Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
* Handle function expressions as signal handlersErik Verbruggen2018-03-201-0/+8
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | There are two ways to use function expressions on the right-hand side of bindings: property var somethingPressed somethingPressed: function() { /* ..press something else.. */ } signal buttonPressed onButtonPressed: function() { /* ..handle buttonPress.. */ } In the former case, it declares a property that holds a function. So on initialization, the right-hand side of the binding returns a closure that gets assigned to the property 'somethingPressed'. In the latter case, the signal handler is explicitly marked as a function for clarity. So, the handler should not be returning the closure, but the handler should *be* the closure. In general, it is not possible to detect if the left-hand side is a property or a signal handler when generating QML cache files ahead of time. So for this case, we mark the function as only returning a closure. Then when instantiating the object, we check if it is a signal handler, and if the handler is marked as only returning a closure. If so, we set that closure to be the signal handler. Task-number: QTBUG-57043 Task-number: QTBUG-50328 Change-Id: I3008ddd847e30b7d0adef07344a326f84d85f1ba Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
* use the override keyword consistently and correctly (clang-tidy)Shawn Rutledge2018-02-271-7/+7
| | | | | Change-Id: If9e28d143f8cba3df3c757476b4f2265e2eb8b2a Reviewed-by: Johan Helsing <johan.helsing@qt.io>
* use nullptr consistently (clang-tidy)Shawn Rutledge2018-02-261-10/+10
| | | | | | | | | | | | | From now on we prefer nullptr instead of 0 to clarify cases where we are assigning or testing a pointer rather than a numeric zero. Also, replaced cases where 0 was passed as Qt::KeyboardModifiers with Qt::NoModifier (clang-tidy replaced them with nullptr, which waas wrong, so it was just as well to make the tests more readable rather than to revert those lines). Change-Id: I4735d35e4d9f42db5216862ce091429eadc6e65d Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
* Correctly set this object when calling scope/context functionsErik Verbruggen2018-02-201-1/+17
| | | | | | | | | | | | | When a function is called that is in a QML scope or a QML context, set the 'this' object to the QML scope. This is done by introducing two new interpreter instructions, which get the context passed in. Note: this patch is 5.11 specific. 5.9 had a similair issue, but the implementation is quite different, so that was fixed separately. Task-number: QTBUG-66432 Change-Id: Ie43150cdd26360025895df28d31264985abf1c15 Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
* Fix "Expression depends on non-NOTIFYable properties" regressionMitch Curtis2018-02-171-6/+6
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | CONSTANT properties are by nature non-NOTIFYable. The issue behind the regression is caused by the fact that we were capturing a property regardless of whether or not it was const. There were two states that captureRequired was expressing: true: We're reading the property of a QObject, and we're not quite sure where the QObject comes from or what it is. So, when reading that property at run-time, make sure that we capture where we read that property so that if it changes we can re-evaluate the entire expression. false: We're reading the property of a QObject, and we know that it's the scope object or context object, which we know very well. Instead of registering a property capture every time, we can do that ahead of time and then register all those captures in one shot in registerQmlDependencies(). There is a third state that is only relevant when captureRequired is false: We're reading a property from the scope or context object, but it's a CONSTANT property, so we don't need to register a dependency at all. This patch adds replaces captureRequired with the PropertyCapturePolicy enum, which accounts for the third state and, as a bonus, makes the code easier to understand. Task-number: QTBUG-66361 Change-Id: I6cef1deb76538fbdacf1324b4467403dd40dd7de Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
* Add missing Q_FALLTRHOUGH()Thiago Macieira2018-02-161-0/+2
| | | | | Change-Id: I940917d6763842499b18fffd1513b8c1308ce873 Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
* Merge remote-tracking branch 'origin/5.10' into devLiang Qi2018-02-021-0/+3
|\ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Conflicts: src/plugins/qmltooling/qmldbg_profiler/qqmlprofilerservice.cpp src/qml/compiler/qqmlirbuilder.cpp src/qml/compiler/qqmlirbuilder_p.h src/qml/compiler/qqmltypecompiler.cpp src/qml/compiler/qv4codegen.cpp src/qml/compiler/qv4codegen_p.h src/qml/compiler/qv4compileddata_p.h src/qml/compiler/qv4compiler.cpp src/qml/compiler/qv4compilercontext_p.h src/qml/compiler/qv4isel_moth.cpp src/qml/compiler/qv4jsir.cpp src/qml/compiler/qv4jsir_p.h src/qml/jit/qv4isel_masm.cpp src/qml/jsruntime/qv4engine.cpp src/qml/jsruntime/qv4functionobject.cpp src/qml/jsruntime/qv4runtimecodegen.cpp src/qml/jsruntime/qv4script.cpp src/qml/jsruntime/qv4script_p.h src/qml/qml/qqmltypeloader.cpp src/quick/items/qquickanimatedimage.cpp src/quick/items/qquickanimatedimage_p_p.h src/quick/scenegraph/compressedtexture/qsgpkmhandler.cpp tests/auto/qml/qmlplugindump/qmlplugindump.pro tests/auto/qml/qmlplugindump/tst_qmlplugindump.cpp tools/qmlcachegen/qmlcachegen.cpp tools/qmljs/qmljs.cpp Done-with: Shawn Rutledge <shawn.rutledge@qt.io> Done-with: Lars Knoll <lars.knoll@qt.io> Done-with: Ulf Hermann <ulf.hermann@qt.io> Change-Id: I010e6525440a85f3b9a10bb9083f8e4352751b1d
| * Merge remote-tracking branch 'origin/5.9' into 5.10Liang Qi2018-01-241-0/+4
| |\ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Conflicts: .qmake.conf src/qml/compiler/qv4codegen.cpp src/qml/compiler/qv4compileddata_p.h src/qml/debugger/qqmlprofiler_p.h src/qml/jsruntime/qv4engine.cpp src/qml/memory/qv4mm.cpp src/qml/qml/qqmlcomponent.cpp src/qml/qml/qqmlobjectcreator.cpp src/qml/qml/qqmlobjectcreator_p.h src/qml/types/qqmldelegatemodel.cpp src/quick/items/qquickitem_p.h src/quick/items/qquickwindow.cpp tests/auto/quick/touchmouse/BLACKLIST tests/benchmarks/qml/holistic/tst_holistic.cpp Change-Id: I520f349ab4b048dd337d9647113564fc257865c2
| | * Use potentially intercepted URL as ID for compilation unitsUlf Hermann2017-12-211-0/+4
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | We generally have to pass a URL and a file name everywhere because the logical URL might be something else than the actual file being loaded. For example a QQmlFileSelector might modify the URL to be loaded for a specific file. This resulting URL, however, should not be used to resolve further URLs defined in the file loaded that way. As we need to access QQmlTypeLoader::m_url as string more often now, cache it and avoid frequent translations between QUrl and QString. Furthermore, QQmlDataBlob's URLs are changed to follow the same semantics. The finalUrl is the one that should be used to resolve further URLs, the url is the one used to load the content, and subject to any redirects or interceptions. This changes the semantics of URL redirects. Previously a redirected URL was used as the base URL for furher URL resolution. This doesn't work because redirection occurs after interception and interception should not influence the resolution of further URLs. We now use the original URL as base URL for resolution of further URLs and rely on the server to redirect those, too. Task-number: QTBUG-61209 Change-Id: I93822f820bed2515995de3cb118099218b510ca4 Reviewed-by: Michael Brasser <michael.brasser@live.com>
* | | Fix iterator assignment for for-in loopsErik Verbruggen2017-12-131-12/+21
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | When iterating over an object using an for-in loop, the value for the next iteration should be assigned in the body of the loop. This means that after the loop, the value of the last iteration is still assigned to that variable, not null (which marks the end of the iterable values). Task-number: QTBUG-65104 Change-Id: Icbddbc67723719005120587bcdc63dcdfa52b67f Reviewed-by: Lars Knoll <lars.knoll@qt.io>
* | | V4: Change CallValue to have the value on the stackErik Verbruggen2017-11-231-2/+2
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | We used to store the value-to-be-called in the accumulator. So the generated bytecode looked like: LoadReg r1 CallValue() The first thing done in CallValue is to store the accumulator. So by not loading the accumulator, we can actually remove the subsequent store, which results in less interpreter instructions and one less store in CallValue. Change-Id: Icc7c8a5449bf369b9226d66bc6055cb705ef660e Reviewed-by: Lars Knoll <lars.knoll@qt.io>
* | | V4: Collapse LoadRegExp+StoreReg into MoveRegExpErik Verbruggen2017-11-231-2/+3
| | | | | | | | | | | | | | | | | | | | | | | | LoadRegExp is nearly always followed by a store of the accumulator, so change LoadRegExp to be MoveRegExp. This saves an instruction. Change-Id: I5d47c5bf6ffd7f28247c328410872c3b229ca23c Reviewed-by: Lars Knoll <lars.knoll@qt.io>
* | | Don't create a CallContext if arguments are being used in strict modeLars Knoll2017-11-151-2/+3
| | | | | | | | | | | | | | | | | | | | | The strict arguments object doesn't need a callcontext. Change-Id: I1d6419c456b28741167f76937906faffd2d5d3b4 Reviewed-by: Erik Verbruggen <erik.verbruggen@qt.io>
* | | V4: Get rid of Reference::This and treat it as a stack slotErik Verbruggen2017-11-141-11/+0
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This actually generates better code, for example for 'this.x'. Previously: LoadReg (this) GetLookupA acc(0) Now: GetLookup (this)(0) Change-Id: I7e4125d3dff707e9af9691f8b00c5c398087e395 Reviewed-by: Lars Knoll <lars.knoll@qt.io>
* | | Set Jump locations for loopsUlf Hermann2017-11-081-0/+27
| | | | | | | | | | | | | | | | | | | | | | | | We don't need them for if/else anymore as there are not block terminators anymore. Change-Id: I1ac384e7176cc35faf28028cd274c63dfaa96146 Reviewed-by: Lars Knoll <lars.knoll@qt.io>
* | | Refactor Call/Construct instructionsLars Knoll2017-11-071-25/+30
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Give them a pointer to argc and argv instead of a pointer to a full callData. Like this we can construct the callData at the end of the JS stack and avoid the need to create an additional copy in VME::exec(). This also opens up the option of completely avoiding all copies for calls into runtime methods. Also make sure that the calldata we pass into other functions is always at the top of the JS stack. Change-Id: I3d0eb49f7bfd7adb9ddabb213422087c66e5a520 Reviewed-by: Erik Verbruggen <erik.verbruggen@qt.io>
* | | Codegen: Set source location for return instructionUlf Hermann2017-11-061-0/+1
| | | | | | | | | | | | | | | | | | | | | | | | We need that in order to be able to break on the closing brace of a function. Change-Id: I4049f0553b01442025bda32c34fac6ce3d77246d Reviewed-by: Lars Knoll <lars.knoll@qt.io>
* | | Re-enable Debug instructions and locations for QML functionsUlf Hermann2017-11-061-1/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Debug instructions are used to trigger break points and are added for every source line. We also need to insert Debug instructions before Ret, so that we can step out. We also need to assign line numbers to the entry and return points of "abbreviated" QML functions (by simulating lbrace and rbrace) so that we can set break points on them. The line numbers on Ret need to be negative, so that you cannot (accidentally) set break points on them. A typical signal handler or binding in QML consists of only one line and if you set a break point on that line, you want it to hit only once, when entering the function. If the line numbers on Ret were positive, it would be hit again on exit. Some of the tests in tst_qqmldebugjs implicitly check for that. Also the new interpreter does something on the left brace, so a function actually starts there, not on the first statement. Change-Id: Id9dfb20e35696b420d0950deab988f7cc5197bfc Reviewed-by: Lars Knoll <lars.knoll@qt.io>
* | | Remove Binop/BinopContext instructions and implement missing binopsErik Verbruggen2017-10-231-67/+42
| | | | | | | | | | | | | | | Change-Id: Ibefac50246045066c90c4c2dbc36d2776c5dab0e Reviewed-by: Lars Knoll <lars.knoll@qt.io>
* | | Fix potential crash in codegenErik Verbruggen2017-10-231-15/+24
| | | | | | | | | | | | | | | | | | | | | | | | Do more checking for previous errors: evaluating a condition can return an invalid result, because it might bail out because of an error. Change-Id: I14709e48f00146baac9599320e436abb30acc938 Reviewed-by: Lars Knoll <lars.knoll@qt.io>
* | | Improve while(true/false) condition generationErik Verbruggen2017-09-261-2/+12
| | | | | | | | | | | | | | | | | | | | | Both in while-loops and in do-while-loops. Change-Id: I50be52e3ea6ecb9ce6886e6da03c35a1790a45e8 Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
* | | Fix delayed loading of arguments in binary expressionsErik Verbruggen2017-09-201-4/+106
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Consider the following functions: function f(x) { return x + (++x) } function g(x) { return x + x } In f() it is not correct to delay the load of x on the left-hand side of the + operator, while in g() it is. The reason is that calculating the right-hand side of the + operator in f() will change the value of x. So, if an argument is written to in an expression in a statement, it cannot be delay-loaded. The same is true for member/field accesses, because the accessors can be overwritten and do anything. Change-Id: I5bed4b0d03919edc1c94a82127e2dd705fc1d9b1 Reviewed-by: Lars Knoll <lars.knoll@qt.io> Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
* | | Fix name lookup in QML signal handlersErik Verbruggen2017-09-081-2/+2
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | We need to use an activation context for signal handlers, because parameter names are not explicitly stated, but loaded from the meta- object. However, while compiling we don't know if a function is a signal handler or not, so we need an activation context for all bindings. Change-Id: Ia2fce3bcb1bc1abb11e74fedb429dda9205fa7e5 Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
* | | Get rid of the hack for named expressionsLars Knoll2017-09-021-2/+14
| | | | | | | | | | | | | | | | | | | | | | | | Instead simply use the pointer to the FunctionObject we have in the CallData now. Change-Id: I6d7ed8af22e89e0217bef427110611b661ac7965 Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
* | | Generate a Decrement instead of a Sub with -1 as the rhsErik Verbruggen2017-09-011-5/+11
| | | | | | | | | | | | | | | Change-Id: Ie7f5f620089d58752d8f284293acda5794b4e99a Reviewed-by: Lars Knoll <lars.knoll@qt.io>
* | | Generate Cmp* instructions instead of calling into the runtimeErik Verbruggen2017-09-011-8/+84
| | | | | | | | | | | | | | | Change-Id: Ia8f214e60f394f25235358b4ec529f78f4d3f263 Reviewed-by: Lars Knoll <lars.knoll@qt.io>
* | | Fix invalid condition inversion for conditional jumpsErik Verbruggen2017-09-011-62/+60
| | | | | | | | | | | | | | | | | | | | | | | | | | | We now have separate instructions for comparissons, which put the result in the accumulator. Then a JumpTrue/JumpFalse is generated to do the actual jump. Change-Id: I50a9d5899a6e071f4997931de6e8eb62596723cd Reviewed-by: Lars Knoll <lars.knoll@qt.io>
* | | Fix compiler warning on gccLars Knoll2017-09-011-1/+1
| | | | | | | | | | | | | | | Change-Id: I9a1b7d1ec9c0a66a34418ae3822b96c1c0d3eb86 Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
* | | Don't emit bytecode just to set the thisObject to undefinedLars Knoll2017-09-011-1/+1
| | | | | | | | | | | | | | | | | | | | | | | | The stubs doing the calls often overwrite the value, and can in any case do it more efficiently. Change-Id: I0bb2fb3dcc34e805e0a4a178db02f99816d5cf46 Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
* | | Move CallContext construction into a interpreter instructionLars Knoll2017-09-011-2/+7
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This will allow us to further cut down on function call overhead. To make this work, introduce a proper distinction between EvalCode and GlobalCode and use the correct compilation mode in all places. Change-Id: I070621142159b7416026347c9239200c5ed7a56b Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
* | | Unify JSStackFrame and CallDataLars Knoll2017-09-011-9/+9
| | | | | | | | | | | | | | | Change-Id: I4494dae8166026074c9efc74bac62de9d3fa2342 Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
* | | Add the current context and function object to CallDataLars Knoll2017-09-011-2/+7
| | | | | | | | | | | | | | | | | | | | | | | | Like this we can avoid creating Scope's when calling functions. Change-Id: I59b82c85eafd3a5437c233aba5f2e8330d5ce104 Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
* | | Get rid of the specialized Moth::CompilationUnitLars Knoll2017-08-311-3/+2
| | | | | | | | | | | | | | | | | | | | | | | | It didn't do anything special anymore, so fold the last small bit of functionality back into the base class. Change-Id: Ic8f62e645b2742aa91f13f63adaf321353962bc5 Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
* | | Remove the codeRefs in the Moth::CompilationUnitLars Knoll2017-08-301-5/+0
| | | | | | | | | | | | | | | | | | | | | | | | | | | There's no point in allocating that vector of byte arrays, if we can directly embed those int the CompiledData and reference it from there. Change-Id: I8fc92b1efaca5a9646f40fc84a2ac4191c8f3444 Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
* | | Fix compilation failures on Ubuntu 16.10 (gcc 6.2.0)Erik Verbruggen2017-08-291-2/+4
| | | | | | | | | | | | | | | Change-Id: Ia70727deb008021cbef6e546816b33ff0ce64afa Reviewed-by: Lars Knoll <lars.knoll@qt.io>
* | | Cleanup closure handling in codegenLars Knoll2017-08-281-19/+24
| | | | | | | | | | | | | | | | | | | | | | | | | | | We don't really need closure's to part of the Reference type. Instead simply load them into the accumulator when needed, and use a reference to the Accumulator instead. Change-Id: I4ca8c60083c9f2fa0da1db6c3c53718e3a32fc6f Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
* | | Add a load/storeLocal instructionLars Knoll2017-08-281-8/+20
| | | | | | | | | | | | | | | Change-Id: I084979a6fef7cce9a825cae9ce57234583ceb3ce Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
* | | Fix naming conflict for "swap" functionErik Verbruggen2017-08-251-2/+2
| | | | | | | | | | | | | | | Change-Id: I542ecabaaa9cd01bd1266456e317c842abd0a3de Reviewed-by: Lars Knoll <lars.knoll@qt.io>
* | | Correctly initialize the first function line in the bytecode generatorErik Verbruggen2017-08-251-0/+1
| | | | | | | | | | | | | | | Change-Id: I54824554a908de4ac764d637fb43a0c79809c718 Reviewed-by: Lars Knoll <lars.knoll@qt.io>
* | | Move line number information into a side tableLars Knoll2017-08-251-3/+4
| | | | | | | | | | | | | | | | | | | | | | | | | | | Don't emit any Line instructions anymore, and instead store the info in a side table in the compiled data, where it can be looked up on demand. Change-Id: Idcaf3bf4ee4129fd62f9e717bf1277dc6a34fe19 Reviewed-by: Erik Verbruggen <erik.verbruggen@qt.io>
* | | Specialize possible direct calls to evalLars Knoll2017-08-251-1/+5
| | | | | | | | | | | | | | | | | | | | | To avoid additional overhead on most function calls Change-Id: I2477b91fda6216b508c8331884a02b601f65590c Reviewed-by: Erik Verbruggen <erik.verbruggen@qt.io>
* | | Cleanup object construction instructionsLars Knoll2017-08-251-3/+3
| | | | | | | | | | | | | | | | | | | | | | | | Remove the unused Create/Construct instructions, and rename the single remaining one to 'Construct'. Change-Id: I10163a15681156f37e34d21a05d195d3c22adcff Reviewed-by: Erik Verbruggen <erik.verbruggen@qt.io>
* | | Add optimized branch instructions for comparisons with intsLars Knoll2017-08-251-4/+18
| | | | | | | | | | | | | | | Change-Id: Ib5d5dc3b0e4a67b950ca9804edd3b6434fcdf9d1 Reviewed-by: Erik Verbruggen <erik.verbruggen@qt.io>
* | | Add optimized JmpCmpEq/NeNull instructionsLars Knoll2017-08-251-2/+38
| | | | | | | | | | | | | | | | | | | | | for comparisons with null or undefined. Change-Id: I4a70d12ace501e4c4735b2ccfd6de19aeb9fef22 Reviewed-by: Erik Verbruggen <erik.verbruggen@qt.io>
* | | Make sure the for-in loop variable is an lvalueErik Verbruggen2017-08-211-2/+2
| | | | | | | | | | | | | | | Change-Id: Ia040a5e0080e1619d5ec19a07138cf26e7a8086b Reviewed-by: Lars Knoll <lars.knoll@qt.io>
* | | still emit global load instructions when 'undefined' is used as lhsLars Knoll2017-08-211-8/+14
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | When using undefined/NaN as LHS instructions, we need to emit them as global loads to get the correct runtime type error. Amends c8a2e4acb101967c254d7e9d3c4e7d9f25c5eecc Change-Id: Ic03fb88e43b4f1c7e5dfb99faa78e7d35a3a6f8a Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
* | | Store the actual string for name in ReferenceLars Knoll2017-08-211-11/+11
| | | | | | | | | | | | | | | | | | | | | | | | | | | Delay desolving the name to an index until we actually need it. This avoids storing strings that are never used in the string table. Change-Id: I935a2d07c03234097b4cf6cfe98231528ac3b15c Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
* | | Split store-on-stack functions for "known destination"Erik Verbruggen2017-08-181-1/+7
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | If the destination slot is known, there is no need to return and use it. This also works around certain versions of GCC that won't recognize the cast-to-void pattern to ignore return results. Change-Id: Iabf7ab1141c4f606030f2dda10ef69d1b090fb72 Reviewed-by: Lars Knoll <lars.knoll@qt.io>