GitLab will be upgraded on June 2nd 2020 at 2.00 pm (AEDT) to 3.00 pm (AEDT) due to Critical Security Patch Availability. During the update, GitLab and Mattermost services will not be available. If you have any concerns with this, please talk to local Gitlab admin team.

Commit 694684b2 authored by Kunshan Wang's avatar Kunshan Wang

Use AnyVal for all implicit classes.

parent 5c2d1c03
......@@ -68,18 +68,18 @@ class GlobalBundle extends Bundle {
for (cand <- newNs.all) {
try {
oldNs.add(cand)
def assertPresent[T <: Identified](ns: NestedNamespace[T], obj: T): Unit = {
assert(ns.get(obj.id) == Some(obj))
if (obj.id == 65731) {
printf("Obj[65731] found in ns " + ns)
}
ns.maybeParent match {
case None =>
case Some(ns2) =>
assertPresent(ns2, obj)
}
}
assertPresent(oldNs.asInstanceOf[NestedNamespace[T]], cand)
// def assertPresent[T <: Identified](ns: NestedNamespace[T], obj: T): Unit = {
// assert(ns.get(obj.id) == Some(obj))
// if (obj.id == 65731) {
// printf("Obj[65731] found in ns " + ns)
// }
// ns.maybeParent match {
// case None =>
// case Some(ns2) =>
// assertPresent(ns2, obj)
// }
// }
// assertPresent(oldNs.asInstanceOf[NestedNamespace[T]], cand)
} catch {
case e: NameConflictException =>
throw new IllegalRedefinitionException(
......
......@@ -21,7 +21,7 @@ trait IdentifiedSettable extends Identified {
}
object RichIdentifiedSettable {
implicit class RichIdentifiedSettable[T <: IdentifiedSettable](val is: T) {
implicit class RichIdentifiedSettable[T <: IdentifiedSettable](val is: T) extends AnyVal {
def :=(p: Int): T = {
is.id = p
is
......
......@@ -24,7 +24,7 @@ class Later {
}
object Later {
implicit class Laterable[T](val anything: T) {
implicit class Laterable[T](val anything: T) extends AnyVal {
def later(lat: Later)(job: T => Unit): T = {
lat(() => job(anything))
anything
......
......@@ -716,8 +716,21 @@ class MuCtx(_mutator: Mutator)(
}
object RichMuCtx {
/** Allow you to use the `val h = x << ctx.makeSomeHandle()` or `val h = x(ctx.makeSomeHandle())`
* syntax to dispose it later*/
class DelayedDisposer(garbageList: Buffer[MuValue]) {
def apply[T <: MuValue](v: T): T = {
garbageList += v
v
}
def <<[T <: MuValue](v: T): T = {
garbageList += v
v
}
}
/** Extensions to the MuCtx interface. Not officially part of the client API. */
implicit class RichMuCtx(ctx: MuCtx) {
implicit class RichMuCtx(val ctx: MuCtx) extends AnyVal {
def handleFromBoolean(b: Boolean) = ctx.handleFromInt(if (b) 1 else 0, 1)
def handleFromInt1(num: BigInt) = ctx.handleFromInt(num, 1)
def handleFromInt6(num: BigInt) = ctx.handleFromInt(num, 6)
......@@ -728,17 +741,6 @@ object RichMuCtx {
def handleFromInt64(num: BigInt) = ctx.handleFromInt(num, 64)
def deleteValue(vs: MuValue*) = vs.foreach(ctx.deleteValue)
class DelayedDisposer(garbageList: Buffer[MuValue]) {
def apply[T <: MuValue](v: T): T = {
garbageList += v
v
}
def <<[T <: MuValue](v: T): T = {
garbageList += v
v
}
}
def autoDispose[T](f: DelayedDisposer => T) = {
val garbages = ArrayBuffer[MuValue]()
val dd = new DelayedDisposer(garbages)
......
......@@ -12,23 +12,14 @@ import uvm.IdentifiedSettable
object InternalIDFactory extends IDFactory(32768) // IDs from 32768-65535 are for implementation internal use.
object InternalTypes {
private implicit class IdentifiedSettableAssignable[T <: IdentifiedSettable](i: T) {
def :=(name: String): T = {
i.id = InternalIDFactory.getID()
i.name = Some(name)
i
}
import uvm.RichIdentifiedSettable._
def :=(idName: (Int, String)): T = {
val (id, name) = idName
i.id = id
i.name = Some(name)
i
}
def internal(name: String): (Int, String) = {
val id = InternalIDFactory.getID()
val n = "@uvm.internal.types." + name
(id, n)
}
def internal(name: String) = "@uvm.internal.types." + name
val I1 = TypeInt(1) := internal("i1")
val I6 = TypeInt(6) := internal("i6")
val I8 = TypeInt(6) := internal("i8")
......@@ -65,7 +56,7 @@ object InternalTypePool {
val vecOf = LazyPool[(Type, Long), TypeVector] { case (t, l) => TypeVector(t, l) }
def unmarkedOf(t: Type): Type = t match {
case TypeWeakRef(r) => refOf(r)
case _ => t
case _ => t
}
}
......@@ -78,11 +69,11 @@ object TypeInferer {
}
def inferType(v: SSAVariable): Type = v match {
case c: Constant => c.constTy
case c: Constant => c.constTy
case g: GlobalCell => irefOf(g.cellTy)
case f: Function => funcOf(f.sig)
case p: NorParam => p.ty
case p: ExcParam => REF_VOID
case f: Function => funcOf(f.sig)
case p: NorParam => p.ty
case p: ExcParam => REF_VOID
case r: InstResult => {
val resTys = inferInstResultTypes(r.inst)
try {
......@@ -98,90 +89,90 @@ object TypeInferer {
case i: InstBinOp => Seq(i.opndTy)
case i: InstCmp => i.opndTy match {
case TypeVector(_, l) => Seq(vecOf(I1, l))
case _ => Seq(I1)
case _ => Seq(I1)
}
case i: InstConv => Seq(i.toTy)
case i: InstSelect => Seq(i.opndTy)
case i: InstBranch => Seq()
case i: InstBranch2 => Seq()
case i: InstSwitch => Seq()
case i: InstCall => i.sig.retTys
case i: InstTailCall => Seq()
case i: InstRet => Seq()
case i: InstThrow => Seq()
case i: InstExtractValue => Seq(i.strTy.fieldTys(i.index))
case i: InstInsertValue => Seq(i.strTy)
case i: InstConv => Seq(i.toTy)
case i: InstSelect => Seq(i.opndTy)
case i: InstBranch => Seq()
case i: InstBranch2 => Seq()
case i: InstSwitch => Seq()
case i: InstCall => i.sig.retTys
case i: InstTailCall => Seq()
case i: InstRet => Seq()
case i: InstThrow => Seq()
case i: InstExtractValue => Seq(i.strTy.fieldTys(i.index))
case i: InstInsertValue => Seq(i.strTy)
case i: InstExtractElement => Seq(i.seqTy.elemTy)
case i: InstInsertElement => Seq(i.seqTy)
case i: InstShuffleVector => Seq(vecOf((i.vecTy.elemTy, i.maskTy.len)))
case i: InstNew => Seq(refOf(i.allocTy))
case i: InstNewHybrid => Seq(refOf(i.allocTy))
case i: InstAlloca => Seq(irefOf(i.allocTy))
case i: InstAllocaHybrid => Seq(irefOf(i.allocTy))
case i: InstGetIRef => Seq(irefOf(i.referentTy))
case i: InstGetFieldIRef => Seq(ptrOrIRefOf(i.ptr, i.referentTy.fieldTys(i.index)))
case i: InstGetElemIRef => Seq(ptrOrIRefOf(i.ptr, i.referentTy.elemTy))
case i: InstShiftIRef => Seq(ptrOrIRefOf(i.ptr, i.referentTy))
case i: InstInsertElement => Seq(i.seqTy)
case i: InstShuffleVector => Seq(vecOf((i.vecTy.elemTy, i.maskTy.len)))
case i: InstNew => Seq(refOf(i.allocTy))
case i: InstNewHybrid => Seq(refOf(i.allocTy))
case i: InstAlloca => Seq(irefOf(i.allocTy))
case i: InstAllocaHybrid => Seq(irefOf(i.allocTy))
case i: InstGetIRef => Seq(irefOf(i.referentTy))
case i: InstGetFieldIRef => Seq(ptrOrIRefOf(i.ptr, i.referentTy.fieldTys(i.index)))
case i: InstGetElemIRef => Seq(ptrOrIRefOf(i.ptr, i.referentTy.elemTy))
case i: InstShiftIRef => Seq(ptrOrIRefOf(i.ptr, i.referentTy))
case i: InstGetVarPartIRef => Seq(ptrOrIRefOf(i.ptr, i.referentTy.varTy))
case i: InstLoad => Seq(unmarkedOf(i.referentTy))
case i: InstStore => Seq()
case i: InstCmpXchg => Seq(unmarkedOf(i.referentTy), I1)
case i: InstAtomicRMW => Seq(unmarkedOf(i.referentTy))
case i: InstFence => Seq()
case i: InstTrap => i.retTys
case i: InstWatchPoint => i.retTys
case i: InstCCall => i.sig.retTys
case i: InstNewThread => Seq(THREAD)
case i: InstLoad => Seq(unmarkedOf(i.referentTy))
case i: InstStore => Seq()
case i: InstCmpXchg => Seq(unmarkedOf(i.referentTy), I1)
case i: InstAtomicRMW => Seq(unmarkedOf(i.referentTy))
case i: InstFence => Seq()
case i: InstTrap => i.retTys
case i: InstWatchPoint => i.retTys
case i: InstCCall => i.sig.retTys
case i: InstNewThread => Seq(THREAD)
case i: InstSwapStack => i.curStackAction match {
case RetWith(t) => t
case _: KillOld => Seq()
}
case i: InstCommInst => i.inst.name.get match {
case "@uvm.new_stack" => Seq(STACK)
case "@uvm.kill_stack" => Seq()
case "@uvm.thread_exit" => Seq()
case "@uvm.current_stack" => Seq(STACK)
case "@uvm.tr64.is_fp" => Seq(I1)
case "@uvm.tr64.is_int" => Seq(I1)
case "@uvm.tr64.is_ref" => Seq(I1)
case "@uvm.tr64.from_fp" => Seq(TAGREF64)
case "@uvm.tr64.from_int" => Seq(TAGREF64)
case "@uvm.tr64.from_ref" => Seq(TAGREF64)
case "@uvm.tr64.to_fp" => Seq(DOUBLE)
case "@uvm.tr64.to_int" => Seq(I52)
case "@uvm.tr64.to_ref" => Seq(REF_VOID)
case "@uvm.tr64.to_tag" => Seq(I6)
case "@uvm.futex.wait" => Seq(I32)
case "@uvm.new_stack" => Seq(STACK)
case "@uvm.kill_stack" => Seq()
case "@uvm.thread_exit" => Seq()
case "@uvm.current_stack" => Seq(STACK)
case "@uvm.tr64.is_fp" => Seq(I1)
case "@uvm.tr64.is_int" => Seq(I1)
case "@uvm.tr64.is_ref" => Seq(I1)
case "@uvm.tr64.from_fp" => Seq(TAGREF64)
case "@uvm.tr64.from_int" => Seq(TAGREF64)
case "@uvm.tr64.from_ref" => Seq(TAGREF64)
case "@uvm.tr64.to_fp" => Seq(DOUBLE)
case "@uvm.tr64.to_int" => Seq(I52)
case "@uvm.tr64.to_ref" => Seq(REF_VOID)
case "@uvm.tr64.to_tag" => Seq(I6)
case "@uvm.futex.wait" => Seq(I32)
case "@uvm.futex.wait_timeout" => Seq(I32)
case "@uvm.futex.wake" => Seq(I32)
case "@uvm.futex.cmp_requeue" => Seq(I32)
case "@uvm.kill_dependency" => Seq(i.typeList(0))
case "@uvm.futex.wake" => Seq(I32)
case "@uvm.futex.cmp_requeue" => Seq(I32)
case "@uvm.kill_dependency" => Seq(i.typeList(0))
case "@uvm.native.pin" => i.typeList(0) match {
case TypeRef(t) => Seq(ptrOf(t))
case TypeRef(t) => Seq(ptrOf(t))
case TypeIRef(t) => Seq(ptrOf(t))
}
case "@uvm.native.unpin" => Seq()
case "@uvm.native.expose" => Seq(funcPtrOf(i.funcSigList(0)))
case "@uvm.native.unexpose" => Seq()
case "@uvm.native.get_cookie" => Seq(I64)
case "@uvm.native.unpin" => Seq()
case "@uvm.native.expose" => Seq(funcPtrOf(i.funcSigList(0)))
case "@uvm.native.unexpose" => Seq()
case "@uvm.native.get_cookie" => Seq(I64)
case "@uvm.meta.id_of" => Seq(I32)
case "@uvm.meta.name_of" => Seq(BYTES_R)
case "@uvm.meta.load_bundle" => Seq(BYTES_R)
case "@uvm.meta.load_hail" => Seq(BYTES_R)
case "@uvm.meta.id_of" => Seq(I32)
case "@uvm.meta.name_of" => Seq(BYTES_R)
case "@uvm.meta.load_bundle" => Seq(BYTES_R)
case "@uvm.meta.load_hail" => Seq(BYTES_R)
case "@uvm.meta.cur_func" => Seq(I32)
case "@uvm.meta.cur_func_ver" => Seq(I32)
case "@uvm.meta.cur_inst" => Seq(I32)
case "@uvm.meta.dump_keepalives" => Seq(REFS_R)
case "@uvm.meta.cur_func" => Seq(I32)
case "@uvm.meta.cur_func_ver" => Seq(I32)
case "@uvm.meta.cur_inst" => Seq(I32)
case "@uvm.meta.dump_keepalives" => Seq(REFS_R)
case "@uvm.meta.pop_frame" => Seq()
case "@uvm.meta.push_frame" => Seq()
case "@uvm.meta.pop_frame" => Seq()
case "@uvm.meta.push_frame" => Seq()
case "@uvm.meta.enable_watchpoint" => Seq()
case "@uvm.meta.enable_watchpoint" => Seq()
case "@uvm.meta.disable_watchpoint" => Seq()
case "@uvm.meta.set_trap_handler" => Seq()
case "@uvm.meta.set_trap_handler" => Seq()
}
}
}
\ No newline at end of file
......@@ -255,7 +255,7 @@ trait CommInstExecutor extends InterpreterActions with ObjectPinner {
val Seq(r) = argList
val (addr, offset) = ty match {
case TypeRef(_) => (boxOf(r).asInstanceOf[BoxRef].objRef, 0L)
case TypeRef(_) => (boxOf(r).asInstanceOf[BoxRef].objRef, 0L)
case TypeIRef(_) => boxOf(r).asInstanceOf[BoxIRef].oo
}
......@@ -270,7 +270,7 @@ trait CommInstExecutor extends InterpreterActions with ObjectPinner {
val Seq(r) = argList
val addr = ty match {
case TypeRef(_) => boxOf(r).asInstanceOf[BoxRef].objRef
case TypeRef(_) => boxOf(r).asInstanceOf[BoxRef].objRef
case TypeIRef(_) => boxOf(r).asInstanceOf[BoxIRef].objRef
}
......@@ -343,7 +343,7 @@ trait CommInstExecutor extends InterpreterActions with ObjectPinner {
continueNormally()
}
case "@uvm.meta.load_hail" => {
val Seq(hailScript) = argList
val hailStr = MemoryOperations.bytesToStr(boxOf(hailScript).asInstanceOf[BoxRef].objRef)
......@@ -353,6 +353,23 @@ trait CommInstExecutor extends InterpreterActions with ObjectPinner {
continueNormally()
}
case "@uvm.meta.cur_func" => {
val Seq(stack) = argList
???
}
case "@uvm.meta.cur_func_ver" => ???
case "@uvm.meta.cur_inst" => ???
case "@uvm.meta.dump_keepalives" => ???
case "@uvm.meta.pop_frame" => ???
case "@uvm.meta.push_frame" => ???
case "@uvm.meta.enable_watchpoint" => ???
case "@uvm.meta.disable_watchpoint" => ???
case "@uvm.meta.set_trap_handler" => ???
// Insert more CommInsts here.
case ciName => {
......
......@@ -40,7 +40,7 @@ class InterpreterThread(val id: Int, initialStack: InterpreterStack, val mutator
htr match {
case HowToResume.PassValues(values) => rebindPassValues(initialStack, values)
case HowToResume.ThrowExc(exc) => catchException(exc)
case HowToResume.ThrowExc(exc) => catchException(exc)
}
}
......@@ -87,7 +87,7 @@ trait InterpreterThreadState {
protected def ctx = stack match {
case None => "(Thred not bound to stack): "
case Some(s) => s.top match {
case f: NativeFrame => "TID %d, Native frame for function 0x%x: ".format(id, f.func)
case f: NativeFrame => "TID %d, Native frame for function 0x%x: ".format(id, f.func)
case f: UndefinedMuFrame => "TID %d, Function %s (not defined): ".format(id, f.func.repr)
case f: DefinedMuFrame => {
val ix = f.curInstIndex
......@@ -96,7 +96,7 @@ trait InterpreterThreadState {
} else {
"TID %d, FuncVer %s, BB %s, Inst(%d): %s (%s): ".format(id, f.funcVer.repr, curBB.repr, ix, curInst.repr, curInst match {
case ci: InstCommInst => ci.inst.name.get
case _ => curInst.getClass.getSimpleName()
case _ => curInst.getClass.getSimpleName()
})
}
}
......@@ -106,7 +106,7 @@ trait InterpreterThreadState {
/** Get the value box of an SSA variable in the current stack. */
protected def boxOf(v: SSAVariable): ValueBox = v match {
case g: GlobalVariable => microVM.constantPool.getGlobalVarBox(g)
case l: LocalVariable => topDefMu.boxes(l)
case l: LocalVariable => topDefMu.boxes(l)
}
/** Get the edge-assigned value box of an edge-assigned instruction in the current stack. */
......@@ -165,7 +165,7 @@ trait InterpreterActions extends InterpreterThreadState {
topMu.justCreated = false
topMu match {
case f: DefinedMuFrame => interpretCurrentInstruction()
case f: DefinedMuFrame => interpretCurrentInstruction()
case f: UndefinedMuFrame => executeUndefinedMuFrame()
}
}
......@@ -176,11 +176,11 @@ trait InterpreterActions extends InterpreterThreadState {
assert(f.virtInst != UndefinedMuFrame.VIRT_INST_NOT_STARTED)
f.virtInst match {
case UndefinedMuFrame.VIRT_INST_TRAP => {
logger.debug(ctx+"Executing virtual trap")
logger.debug(ctx + "Executing virtual trap")
doTrap(Seq(), 0)
}
case UndefinedMuFrame.VIRT_INST_TAILCALL => {
logger.debug(ctx+"Executing virtual tail-call")
logger.debug(ctx + "Executing virtual tail-call")
val calleeFunc = f.func
val argBoxes = f.boxes
......@@ -281,7 +281,7 @@ trait InterpreterActions extends InterpreterThreadState {
maybeDestClause match {
case Some(dc) => (f, dc)
case None => f.prev match {
case None => throw new UvmRuntimeException(ctx + "Exception is thrown out of the bottom frame.")
case None => throw new UvmRuntimeException(ctx + "Exception is thrown out of the bottom frame.")
case Some(prev) => unwindUntilCatchable(prev)
}
......@@ -312,10 +312,10 @@ trait InterpreterActions extends InterpreterThreadState {
*/
protected def maybeFindExceptionHandler(inst: Instruction): Option[DestClause] = {
inst match {
case i: InstCall => i.excClause.map(_.exc)
case i: InstTrap => i.excClause.map(_.exc)
case i: InstCall => i.excClause.map(_.exc)
case i: InstTrap => i.excClause.map(_.exc)
case i: InstWatchPoint => i.exc
case i: InstSwapStack => i.excClause.map(_.exc)
case i: InstSwapStack => i.excClause.map(_.exc)
case _ => {
throw new UvmRefImplException(ctx + "Non-OSR point instruction %s (%s) is in a stack frame when an exception is thrown.".format(inst.repr, inst.getClass.getName))
}
......@@ -447,7 +447,7 @@ trait InterpreterActions extends InterpreterThreadState {
*/
protected def branchToExcDestOr(excClause: Option[ExcClause])(f: => Unit): Unit = {
excClause match {
case None => f
case None => f
case Some(ExcClause(_, excBB)) => branchTo(excBB)
}
}
......@@ -486,5 +486,20 @@ trait InterpreterActions extends InterpreterThreadState {
throw new UvmRuntimeException(ctx + "Accessing null reference.")
}
}
import MagicalBox.MagicalBox
implicit protected def ssaVariableToMagicalBox(v: SSAVariable) = new MagicalBox(boxOf(v))
implicit protected def boxToMagicalBox(b: ValueBox) = new MagicalBox(b)
}
object MagicalBox {
implicit class MagicalBox(val box: ValueBox) extends AnyVal {
def getIntRaw(): BigInt = box.asInstanceOf[BoxInt].value
def setIntRaw(v: BigInt): Unit = box.asInstanceOf[BoxInt].value = v
def getSInt(len: Int): BigInt = OpHelper.prepareSigned(box.getIntRaw(), len)
def getUInt(len: Int): BigInt = OpHelper.prepareUnsigned(box.getIntRaw(), len)
def setInt(v: BigInt, len: Int): Unit = box.setIntRaw(OpHelper.unprepare(v, len))
}
}
\ No newline at end of file
......@@ -32,6 +32,11 @@ object OpHelper {
}
}
// The BigInt in a BoxInt is always truncated to len bits.
//
// "prepare" means sign- or zero-extend the content to get the real math value.
// "unprepare" means truncating a math value to len bits to be stored in a BoxInt.
def prepareUnsigned(n: BigInt, len: Int): BigInt = truncFromBigInt(n, len)
def prepareSigned(n: BigInt, len: Int): BigInt = {
......
......@@ -9,7 +9,22 @@ import uvm.ssavariables._
import uvm.comminsts._
trait ExtraMatchers extends Assertions with Matchers {
implicit class AnythingExtraMatchers(val thing: Any) {
import ExtraMatchers._
implicit def anythingToAnythingExtraMatcher[U](thing: U) = new AnythingExtraMatchers(thing)
val thatsIt = { f: Any => }
case object nan
case class ExactFloat(num: Float)
case class ExactDouble(num: Double)
def exactly(num: Float) = ExactFloat(num)
def exactly(num: Double) = ExactDouble(num)
def bitsf(num: Int) = java.lang.Float.intBitsToFloat(num)
def bitsd(num: Long) = java.lang.Double.longBitsToDouble(num)
}
object ExtraMatchers extends ExtraMatchers {
implicit class AnythingExtraMatchers[U](val thing: U) extends AnyVal {
def shouldBeA[T: ClassTag](f: T => Unit): Unit = {
val ct = classTag[T]
if (!ct.runtimeClass.isAssignableFrom(thing.getClass)) {
......@@ -54,17 +69,4 @@ trait ExtraMatchers extends Assertions with Matchers {
}
}
val thatsIt = { f: Any => }
case object nan
case class ExactFloat(num: Float)
case class ExactDouble(num: Double)
def exactly(num: Float) = ExactFloat(num)
def exactly(num: Double) = ExactDouble(num)
def bitsf(num: Int) = java.lang.Float.intBitsToFloat(num)
def bitsd(num: Long) = java.lang.Double.longBitsToDouble(num)
}
object ExtraMatchers {
}
\ No newline at end of file
......@@ -7,13 +7,12 @@ import uvm.comminsts._
import uvm.ssavariables._
import uvm.types._
trait TestingBundlesValidators extends Matchers with ExtraMatchers {
implicit class RichStringContext(sc: StringContext) {
object TestingBundlesValidators {
implicit class RichStringContext(val sc: StringContext) extends AnyVal {
def qw(): Seq[String] = sc.parts(0).split("\\s+")
}
implicit class MagicalOur(b: Bundle) {
implicit class MagicalOur(val b: Bundle) extends AnyVal {
def anything(s: String) = b.allNs(s)
def ty(s: String) = b.typeNs(s)
def const(s: String) = b.constantNs (s)
......@@ -27,18 +26,22 @@ trait TestingBundlesValidators extends Matchers with ExtraMatchers {
def inst(s: String) = b.instNs(s)
}
implicit class MagicalThe(c: FuncVer) {
implicit class MagicalThe(val c: FuncVer) extends AnyVal {
def globalName(s: String) = UIRTextReader.globalize(s, c.name.get)
def bb(s: String) = c.bbNs(UIRTextReader.globalize(s, c.name.get))
}
implicit class MagicalMy(d: BasicBlock) {
implicit class MagicalMy(val d: BasicBlock) extends AnyVal {
def globalName(s: String) = UIRTextReader.globalize(s, d.name.get)
def value(s: String) = d.localVarNs(UIRTextReader.globalize(s, d.name.get))
def param(s: String) = d.localVarNs(UIRTextReader.globalize(s, d.name.get))
def ires(s: String) = d.localVarNs(UIRTextReader.globalize(s, d.name.get))
def inst(s: String) = d.localInstNs(UIRTextReader.globalize(s, d.name.get))
}
}
trait TestingBundlesValidators extends Matchers with ExtraMatchers {
import TestingBundlesValidators._
def validateTypes(bundle: GlobalBundle) {
val our = bundle
......
......@@ -19,6 +19,26 @@ import uvm.refimpl.HowToResume.PassValues
object UvmBundleTesterBase {
val logger = Logger(LoggerFactory.getLogger(getClass.getName))
implicit class MagicalBox(val vb: ValueBox) extends AnyVal {
def asInt: BigInt = vb.asInstanceOf[BoxInt].value
def asSInt(l: Int): BigInt = OpHelper.prepareSigned(vb.asInstanceOf[BoxInt].value, l)
def asUInt(l: Int): BigInt = OpHelper.prepareUnsigned(vb.asInstanceOf[BoxInt].value, l)
def asFloat: Float = vb.asInstanceOf[BoxFloat].value
def asDouble: Double = vb.asInstanceOf[BoxDouble].value
def asRef: Word = vb.asInstanceOf[BoxRef].objRef
def asIRef: (Word, Word) = { val b = vb.asInstanceOf[BoxIRef]; (b.objRef, b.offset) }
def asIRefAddr: Word = { val b = vb.asInstanceOf[BoxIRef]; b.objRef + b.offset }
def asStruct: Seq[ValueBox] = vb.asInstanceOf[BoxSeq].values
def asFunc: Option[Function] = vb.asInstanceOf[BoxFunc].func
def asThread: Option[InterpreterThread] = vb.asInstanceOf[BoxThread].thread
def asStack: Option[InterpreterStack] = vb.asInstanceOf[BoxStack].stack
def asTR64Box: BoxTagRef64 = vb.asInstanceOf[BoxTagRef64]
def asTR64Raw: Long = vb.asInstanceOf[BoxTagRef64].raw
def asSeq: Seq[ValueBox] = vb.asInstanceOf[BoxSeq].values
def asVec: Seq[ValueBox] = vb.asInstanceOf[BoxSeq].values
def asPointer: Word = vb.asInstanceOf[BoxPointer].addr
}
}
abstract class UvmBundleTesterBase extends FlatSpec with Matchers {
......@@ -72,30 +92,13 @@ abstract class UvmBundleTesterBase extends FlatSpec with Matchers {
val hThread = ctx.newThread(hStack, HowToResume.PassValues(args))
microVM.execute()
}
import UvmBundleTesterBase._
implicit def magicalMuValue(mv: MuValue): MagicalBox = MagicalBox(mv.vb)
implicit def magicalValueBox(vb: ValueBox): MagicalBox = MagicalBox(vb)
implicit class MagicalBox(vb: ValueBox) {
def asInt: BigInt = vb.asInstanceOf[BoxInt].value
def asSInt(l: Int): BigInt = OpHelper.prepareSigned(vb.asInstanceOf[BoxInt].value, l)
def asUInt(l: Int): BigInt = OpHelper.prepareUnsigned(vb.asInstanceOf[BoxInt].value, l)
def asFloat: Float = vb.asInstanceOf[BoxFloat].value
def asDouble: Double = vb.asInstanceOf[BoxDouble].value
def asRef: Word = vb.asInstanceOf[BoxRef].objRef
def asIRef: (Word, Word) = { val b = vb.asInstanceOf[BoxIRef]; (b.objRef, b.offset) }
def asIRefAddr: Word = { val b = vb.asInstanceOf[BoxIRef]; b.objRef + b.offset }
def asStruct: Seq[ValueBox] = vb.asInstanceOf[BoxSeq].values
def asFunc: Option[Function] = vb.asInstanceOf[BoxFunc].func
def asThread: Option[InterpreterThread] = vb.asInstanceOf[BoxThread].thread
def asStack: Option[InterpreterStack] = vb.asInstanceOf[BoxStack].stack
def asTR64Box: BoxTagRef64 = vb.asInstanceOf[BoxTagRef64]
def asTR64Raw: Long = vb.asInstanceOf[BoxTagRef64].raw
def asSeq: Seq[ValueBox] = vb.asInstanceOf[BoxSeq].values
def asVec: Seq[ValueBox] = vb.asInstanceOf[BoxSeq].values
def asPointer: Word = vb.asInstanceOf[BoxPointer].addr
}
implicit def richMuCtx(ctx: MuCtx) = RichMuCtx.RichMuCtx(ctx)
def returnFromTrap(st: MuStackRefValue) = Rebind(st, PassValues(Seq()))
}
\ No newline at end of file
}
......@@ -41,7 +41,7 @@ class UvmInterpreterNativeTestsExtra extends UvmBundleTesterBase {
val a0 = ctx.handleFromInt64( funcAddr)
testFunc(ctx, func, Seq(a0)) { (ctx, th, st, wp) =>
val Seq(fp, rv, a, b, c, d) = ctx.dumpKeepalives(st, 0)
val Seq(fp, a, b, c, d) = ctx.dumpKeepalives(st, 0)
fp.vb.asPointer shouldEqual funcAddr
......@@ -69,7 +69,7 @@ class UvmInterpreterNativeTestsExtra extends UvmBundleTesterBase {
val a0 = ctx.handleFromInt64( funcAddr)
testFunc(ctx, func, Seq(a0)) { (ctx, th, st, wp) =>
val Seq(fp, rv, a, b) = ctx.dumpKeepalives(st, 0)
val Seq(fp, a, b) = ctx.dumpKeepalives(st, 0)
fp.vb.asPointer shouldEqual funcAddr
......
......@@ -90,9 +90,6 @@
COMMINST @uvm.thread_exit
}
.typedef @refi32 = ref<@i32>
.typedef @irefi32 = iref<@i32>
.funcsig @futex_gc_waiter_sig = (@refi32) -> ()
.funcdef @futex_gc_waiter VERSION @futex_gc_waiter_v1 <@futex_gc_waiter_sig> {
%entry(<@refi32> %ref):
......
......@@ -25,7 +25,7 @@
.const @I8_o <@i8> = 0x6f
.const @I8_NL <@i8> = 0x0a
.funcsig @writetest_sig = (@write_fp) -> (@void)
.funcsig @writetest_sig = (@write_fp) -> ()
.funcdef @writetest VERSION @writetest_v1 <@writetest_sig> {
%entry(<@write_fp> %fp):
%buf = NEWHYBRID <@CharBuf @i64> @I64_6
......@@ -116,8 +116,8 @@
.typedef @irefstruct_baz = iref<@struct_baz>
.typedef @ptrstruct_baz = uptr<@struct_baz>
.funcsig @foo_func_sig = (@struct_foo @ptri64 @ptri32 @ptri16 @ptri8) -> (@void)
.funcsig @bar_func_sig = (@struct_bar @ptrptrvoid @ptrfpv_v) -> (@void)
.funcsig @foo_func_sig = (@struct_foo @ptri64 @ptri32 @ptri16 @ptri8) -> ()
.funcsig @bar_func_sig = (@struct_bar @ptrptrvoid @ptrfpv_v) -> ()
.funcsig @baz_func_sig = (@struct_baz @ptrfloat @ptri32 @ptrdouble @ptrstruct_baz) -> (@struct_baz)
.typedef @foo_func_fp = ufuncptr<@foo_func_sig>
.typedef @bar_func_fp = ufuncptr<@bar_func_sig>
......@@ -143,7 +143,7 @@
%pc = COMMINST @uvm.native.pin <@irefi16> (%ac)
%pd = COMMINST @uvm.native.pin <@irefi8 > (%ad)