//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; } }
//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; } }