コード例 #1
0
 public IEmitVal Local(string name, IEmitType type)
 {
     var sym = GenSym(name);
     _span.WriteLine(
         "{0};",
         ((IEmitTypeCPP) type).Declare(sym));
     return new EmitValCPP(Target, sym, type);
 }
コード例 #2
0
        public IEmitField AddPublicField(IEmitType type, string name)
        {
            _publicSize = Align( _publicSize, type.Alignment );
            _publicAlign = Math.Max( _publicAlign, type.Alignment );
            _publicSize += type.Size;

            _publicFieldsSpan.WriteLine("{0};",
                ((IEmitTypeCPP)type).Declare(name));
            return new EmitFieldCPP(name, type);
        }
コード例 #3
0
 public IEmitVal GetBuiltinField(IEmitVal obj, string fieldName, IEmitType fieldType)
 {
     return Defer((b) => b.GetBuiltinField(Un(obj), fieldName, Un(fieldType)));
 }
コード例 #4
0
 public IEmitVal GetBuiltinField(
     IEmitVal obj,
     string fieldName,
     IEmitType fieldType)
 {
     return new EmitValCPP(
         Target,
         string.Format("({0}.{1})", obj, fieldName),
         fieldType);
 }
コード例 #5
0
        public void WriteParameter(
            IEmitType type,
            string name,
            bool first,
            Span span)
        {
            if (!first)
                span.Write(",");
            span.WriteLine();

            span.Write(((IEmitTypeCPP) type).Declare(name));
        }
コード例 #6
0
 public EmitTargetCPP()
 {
     _voidType = new EmitTypeCPP(this, "void {0}", 0, 0, null);
 }
コード例 #7
0
        public IEmitVal BuiltinApp(
            IEmitType type,
            string template,
            IEmitVal[] args)
        {
            var valString = args == null ? template :
                string.Format(template, args);

            if (type == null || (type == Target.VoidType))
            {
                _span.WriteLine("{0};", valString);
                return null;
            }

            return new EmitValCPP(
                Target,
                valString,
                type);
        }
コード例 #8
0
        public EmitMethodCPP(
            EmitClassCPP clazz,
            string prefix,
            string name,
            string cconv,
            IEmitType resultType,
            Span headerSpan,
            Span sourceSpan)
        {
            _class = clazz;
            _name = name;
            _cconv = cconv;
            _resultType = resultType;
            _headerSpan = headerSpan;
            _sourceSpan = sourceSpan;

            _headerSpan.Write( "static " );
            _headerParamsSpan = CreateSignatureSpan(
                _name,
                _headerSpan);
            _headerSpan.WriteLine(";");

            _fullName = prefix + _name;

            _sourceParamsSpan = CreateSignatureSpan(
                prefix + _name,
                _sourceSpan);
            _sourceSpan.WriteLine();
            _sourceSpan.WriteLine("{");
            _bodySpan = _sourceSpan.IndentSpan();
            _sourceSpan.WriteLine("}");

            _thisParameter = (EmitValCPP) AddParameter(
                Target.Pointer( clazz ),
                "self" );
            _entryBlock = new EmitBlockCPP(this, _bodySpan.InsertSpan());
        }
コード例 #9
0
 public IEmitVal BuiltinApp(IEmitType type, string template, IEmitVal[] args)
 {
     return Defer((b) => b.BuiltinApp(Un(type), template, Un(args)));
 }
コード例 #10
0
 public IEmitVal CastRawPointer(IEmitVal val, IEmitType type)
 {
     return Defer((b) => b.CastRawPointer(Un(val), Un(type)));
 }
コード例 #11
0
 public IEmitVal Array(IEmitType elementType, IEmitVal[] elements)
 {
     return Defer((b) => b.Array(Un(elementType), Un(elements)));
 }
コード例 #12
0
 private IEmitType Un(IEmitType type)
 {
     if (type is LazyEmitType)
     {
         return ((LazyEmitType)type).Type;
     }
     return type;
 }
コード例 #13
0
 public IEmitVal Local(string name, IEmitType type)
 {
     return Defer((b) => b.Local(name, Un(type)));
 }
コード例 #14
0
 public IEmitMethod CreateMethod(IEmitType resultType, string name)
 {
     _publicSpan.WriteLine();
     _sourceSpan.WriteLine();
     return new EmitMethodCPP(
         this,
         string.Format("{0}::", _name),
         name,
         "__stdcall",
         resultType,
         _publicSpan.InsertSpan(),
         _sourceSpan.InsertSpan());
 }
コード例 #15
0
 public IEmitVal GetNullPointer(IEmitType type)
 {
     return new EmitValCPP(this, "nullptr", type);
 }
コード例 #16
0
 public EmitFieldCPP(
     string name,
     IEmitType type)
 {
     _name = name;
     _type = type;
 }
コード例 #17
0
 public IEmitType Pointer(IEmitType type)
 {
     return new EmitTypeCPP(this, "*{0}", 4, 4, (IEmitTypeCPP) type);
 }
コード例 #18
0
        public IEmitVal AddParameter(IEmitType type, string name)
        {
            bool first = _parameters.Count == 0;

            var param = new EmitValCPP(Target, name, type);
            _parameters.Add(param);

            WriteParameter(type, name, first, _headerParamsSpan);
            WriteParameter(type, name, first, _sourceParamsSpan);

            return param;
        }
コード例 #19
0
 public EmitValCPP(
     EmitTargetCPP target,
     string name,
     IEmitType type,
     bool isOwnAddress = false )
 {
     _target = target;
     _name = name;
     _type = type;
     _isOwnAddress = isOwnAddress;
 }
コード例 #20
0
        public IEmitVal Array(
            IEmitType elementType,
            IEmitVal[] elements)
        {
            var span = new Span();
            span.WriteLine("{");
            foreach (var e in elements)
            {
                span.WriteLine("\t{0},", e);
            }
            span.Write("}");

            return new EmitValCPP(
                Target,
                span.ToString(),
                Target.Array(elementType, elements.Length),
                true);
        }
コード例 #21
0
        public IEmitVal CastRawPointer(IEmitVal val, IEmitType type)
        {
            var ty = type ?? Target.Pointer( Target.GetBuiltinType( "unsigned char" ) );

            return new EmitValCPP(
                Target,
                string.Format( "(({0}) {1})", ty, val ),
                ty);
        }
コード例 #22
0
 public IEmitType Array(IEmitType type, int length)
 {
     return new EmitTypeCPP(this, "{0}[]", type.Size * (UInt32) length, type.Alignment, (EmitTypeCPP)type);
 }
コード例 #23
0
 public static IEmitVal Array(
     this IEmitBlock block,
     IEmitType elementType,
     IEnumerable<IEmitVal> elements)
 {
     return block.Array(elementType, elements.ToArray());
 }