コード例 #1
0
        //Pushes a primitive value. It can be a string, a char,
        //a 32-bit integer, a 64-bit integer, a 32-bit float, a 64-bit float,
        //a boolean or unit.
        private void PushPrimitive(ElaExpression exp, ElaLiteralValue val)
        {
            switch (val.LiteralType)
            {
            case ElaTypeCode.String:
                var str = val.AsString();

                //String is added to the string table and indexed
                //An empty string is pushed using special op typeId.
                if (str.Length == 0)
                {
                    cw.Emit(Op.Pushstr_0);
                }
                else
                {
                    cw.Emit(Op.Pushstr, AddString(str));
                }
                break;

            case ElaTypeCode.Char:
                cw.Emit(Op.PushCh, val.AsInteger());
                break;

            case ElaTypeCode.Integer:
                var v = val.AsInteger();

                if (v == 0)
                {
                    cw.Emit(Op.PushI4_0);
                }
                else
                {
                    cw.Emit(Op.PushI4, v);
                }
                break;

            case ElaTypeCode.Long:
                //64-bit long is pushed as two 32-bit integers
                cw.Emit(Op.PushI4, val.GetData().I4_1);
                cw.Emit(Op.PushI4, val.GetData().I4_2);
                cw.Emit(Op.NewI8);
                break;

            case ElaTypeCode.Single:
                cw.Emit(Op.PushR4, val.GetData().I4_1);
                break;

            case ElaTypeCode.Double:
                //64-bit float is pushed as two 32-bit integers
                cw.Emit(Op.PushI4, val.GetData().I4_1);
                cw.Emit(Op.PushI4, val.GetData().I4_2);
                cw.Emit(Op.NewR8);
                break;

            case ElaTypeCode.Boolean:
                cw.Emit(val.AsBoolean() ? Op.PushI1_1 : Op.PushI1_0);
                break;

            case ElaTypeCode.__Reserved:
                cw.Emit(Op.Pushstr, AddString(val.AsString()));
                var sv = GetVariable("literal'" + Char.ToLower(val.Postfix), exp.Line, exp.Column);
                PushVar(sv);
                cw.Emit(Op.Call);
                break;

            default:
                cw.Emit(Op.Pushunit);
                break;
            }
        }
コード例 #2
0
ファイル: Builder.Literals.cs プロジェクト: rizwan3d/elalang
        //Pushes a primitive value. It can be a string, a char,
        //a 32-bit integer, a 64-bit integer, a 32-bit float, a 64-bit float,
        //a boolean or unit.
        private void PushPrimitive(ElaLiteralValue val)
        {
            switch (val.LiteralType)
            {
                case ElaTypeCode.String:
                    var str = val.AsString();

                    //String is added to the string table and indexed
                    //An empty string is pushed using special op typeId.
                    if (str.Length == 0)
                        cw.Emit(Op.Pushstr_0);
                    else
                        cw.Emit(Op.Pushstr, AddString(str));
                    break;
                case ElaTypeCode.Char:
                    cw.Emit(Op.PushCh, val.AsInteger());
                    break;
                case ElaTypeCode.Integer:
                    var v = val.AsInteger();

                    if (v == 0)
                        cw.Emit(Op.PushI4_0);
                    else
                        cw.Emit(Op.PushI4, v);
                    break;
                case ElaTypeCode.Long:
                    //64-bit long is pushed as two 32-bit integers
                    cw.Emit(Op.PushI4, val.GetData().I4_1);
                    cw.Emit(Op.PushI4, val.GetData().I4_2);
                    cw.Emit(Op.NewI8);
                    break;
                case ElaTypeCode.Single:
                    cw.Emit(Op.PushR4, val.GetData().I4_1);
                    break;
                case ElaTypeCode.Double:
                    //64-bit float is pushed as two 32-bit integers
                    cw.Emit(Op.PushI4, val.GetData().I4_1);
                    cw.Emit(Op.PushI4, val.GetData().I4_2);
                    cw.Emit(Op.NewR8);
                    break;
                case ElaTypeCode.Boolean:
                    cw.Emit(val.AsBoolean() ? Op.PushI1_1 : Op.PushI1_0);
                    break;
                default:
                    cw.Emit(Op.Pushunit);
                    break;
            }
        }