Example #1
0
        private void EmitNodeWriteAssign(CodeGenerator codeGenerator)
        {
            ChainBuilder chain = codeGenerator.ChainBuilder;

            // Note that for cases 1,3,4,5,6,9 EmitAssign is never called!!!

            // 2,7,8
            if (chain.IsMember)
            {
                // 2,8
                if (chain.Exists)
                {
                    // 8: b[]->$a
                    chain.EmitSetObjectField();
                }
                else
                {
                    // 2: $b->a
                    Debug.Assert(this.isMemberOf is SimpleVarUse || this.isMemberOf is FunctionCall);
                    if (this.isMemberOf is FunctionCall)
                    {
                        codeGenerator.ChainBuilder.LoadAddressOfFunctionReturnValue = true;
                    }

                    assignmentCallback(codeGenerator, PhpTypeCode.Object);

                    SimpleVarUse svu = this.isMemberOf as SimpleVarUse;
                    if (svu != null)
                    {
                        svu.EmitLoadAddress_StoreBack(codeGenerator);
                    }
                    // else do nothing
                }
                chain.End();
            }
            else
            {
                // 7: $a
                //codeGenerator.EmitVariableStoreAssign(this);
                this.EmitStoreAssign(codeGenerator);
            }
        }