diff options
author | Simon J. Gerraty <sjg@FreeBSD.org> | 2019-01-21 20:23:49 +0000 |
---|---|---|
committer | Simon J. Gerraty <sjg@FreeBSD.org> | 2019-01-21 20:23:49 +0000 |
commit | f55287d3221d3d9128a6529f97e55fb74250aec2 (patch) | |
tree | 9f1232240de5b9c8dc773240213b7eb3ad319df1 /T0/OpcodeConst.cs |
Notes
Diffstat (limited to 'T0/OpcodeConst.cs')
-rw-r--r-- | T0/OpcodeConst.cs | 95 |
1 files changed, 95 insertions, 0 deletions
diff --git a/T0/OpcodeConst.cs b/T0/OpcodeConst.cs new file mode 100644 index 000000000000..ae75ae59d651 --- /dev/null +++ b/T0/OpcodeConst.cs @@ -0,0 +1,95 @@ +/* + * Copyright (c) 2016 Thomas Pornin <pornin@bolet.org> + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +using System; +using System.Collections.Generic; + +class OpcodeConst : Opcode { + + TValue val; + + internal OpcodeConst(TValue val) + { + this.val = val; + } + + internal override void Run(CPU cpu) + { + cpu.Push(val); + } + + internal override Word GetReference(T0Comp ctx) + { + TPointerXT xt = val.ptr as TPointerXT; + if (xt == null) { + return null; + } + xt.Resolve(ctx); + return xt.Target; + } + + internal override ConstData GetDataBlock(T0Comp ctx) + { + TPointerBlob bp = val.ptr as TPointerBlob; + return bp == null ? null : bp.Blob; + } + + internal override CodeElement ToCodeElement() + { + if (val.ptr == null) { + return new CodeElementUIntInt(1, val.Int); + } + TPointerXT xt = val.ptr as TPointerXT; + if (xt != null) { + if (val.x != 0) { + throw new Exception( + "Cannot compile XT: non-zero offset"); + } + return new CodeElementUIntInt(1, xt.Target.Slot); + } + TPointerBlob bp = val.ptr as TPointerBlob; + if (bp != null) { + return new CodeElementUIntInt(1, + val.x + bp.Blob.Address); + } + TPointerExpr cx = val.ptr as TPointerExpr; + if (cx != null) { + return new CodeElementUIntExpr(1, cx, val.x); + } + throw new Exception(String.Format( + "Cannot embed constant (type = {0})", + val.ptr.GetType().FullName)); + } + + internal override int StackAction { + get { + return 1; + } + } + + public override string ToString() + { + return "const " + val.ToString(); + } +} |