Exemplo n.º 1
0
        /// <include file='Doc/Nodes.xml' path='doc/method[@name="Emit"]/*'/>
        internal override PhpTypeCode Emit(CodeGenerator /*!*/ codeGenerator)
        {
            Statistics.AST.AddNode("FieldUse.Static");
            ChainBuilder chain  = codeGenerator.ChainBuilder;
            PhpTypeCode  result = PhpTypeCode.Invalid;

            switch (codeGenerator.SelectAccess(access))
            {
            case AccessType.Read:
                result = EmitRead(codeGenerator, false);
                if (chain.IsMember)
                {
                    chain.Lengthen();
                }
                break;

            case AccessType.ReadUnknown:
                result = EmitRead(codeGenerator, true);
                if (chain.IsMember)
                {
                    chain.Lengthen();
                }
                break;

            case AccessType.ReadRef:
                if (chain.IsMember)
                {
                    chain.Lengthen();
                    result = EmitRead(codeGenerator, false);
                }
                else
                {
                    result = EmitRead(codeGenerator, true);
                }
                break;

            case AccessType.Write:
                if (chain.IsMember)
                {
                    result = EmitEnsure(codeGenerator, chain);
                    chain.Lengthen();
                }
                else
                {
                    assignmentCallback = EmitWrite(codeGenerator, false);
                    result             = PhpTypeCode.Unknown;
                }
                break;

            case AccessType.WriteRef:
                if (chain.IsMember)
                {
                    result = EmitEnsure(codeGenerator, chain);
                    chain.Lengthen();
                }
                else
                {
                    assignmentCallback = EmitWrite(codeGenerator, true);
                    result             = PhpTypeCode.Unknown;
                }
                break;

            case AccessType.None:
                result = PhpTypeCode.Void;
                break;
            }

            return(result);
        }
Exemplo n.º 2
0
		/// <include file='Doc/Nodes.xml' path='doc/method[@name="Emit"]/*'/>
		internal override PhpTypeCode Emit(CodeGenerator/*!*/ codeGenerator)
		{
			Statistics.AST.AddNode("FieldUse.Static");
			ChainBuilder chain = codeGenerator.ChainBuilder;
			PhpTypeCode result = PhpTypeCode.Invalid;

			switch (codeGenerator.SelectAccess(access))
			{
				case AccessType.Read:
					result = EmitRead(codeGenerator, false);
					if (chain.IsMember) chain.Lengthen();
					break;

				case AccessType.ReadUnknown:
					result = EmitRead(codeGenerator, true);
					if (chain.IsMember) chain.Lengthen();
					break;

				case AccessType.ReadRef:
					if (chain.IsMember)
					{
						chain.Lengthen();
						result = EmitRead(codeGenerator, false);
					}
					else
					{
						result = EmitRead(codeGenerator, true);
					}
					break;

				case AccessType.Write:
					if (chain.IsMember)
					{
						result = EmitEnsure(codeGenerator, chain);
						chain.Lengthen();
					}
					else
					{
						assignmentCallback = EmitWrite(codeGenerator, false);
						result = PhpTypeCode.Unknown;
					}
					break;

				case AccessType.WriteRef:
					if (chain.IsMember)
					{
						result = EmitEnsure(codeGenerator, chain);
						chain.Lengthen();
					}
					else
					{
						assignmentCallback = EmitWrite(codeGenerator, true);
						result = PhpTypeCode.Unknown;
					}
					break;

				case AccessType.None:
					result = PhpTypeCode.Void;
					break;
			}

			return result;
		}