From 4514b49b0e4f357f0a75cfee0a120266d877c950 Mon Sep 17 00:00:00 2001 From: ketmar Date: Fri, 26 Nov 2010 19:48:12 +0200 Subject: [PATCH] added Number>>log2 --- imgsrc/defs/base/numbers/float.st | 5 +++++ imgsrc/defs/base/numbers/number.st | 4 ++++ src/lstcore/lst_dpname.c | 2 ++ src/lstcore/lst_interp.c | 17 +++++++++++++++++ 4 files changed, 28 insertions(+) diff --git a/imgsrc/defs/base/numbers/float.st b/imgsrc/defs/base/numbers/float.st index 45b385b..0994024 100644 --- a/imgsrc/defs/base/numbers/float.st +++ b/imgsrc/defs/base/numbers/float.st @@ -74,6 +74,11 @@ floor [ self overflow ] +log2 [ + <#FloatFunc self 0>. + self overflow +] + / arg [ <#FloatDiv self arg>. (0 = arg) ifTrue: [ ^self error: 'division by zero' ]. diff --git a/imgsrc/defs/base/numbers/number.st b/imgsrc/defs/base/numbers/number.st index 5dd5f5f..33a87c5 100644 --- a/imgsrc/defs/base/numbers/number.st +++ b/imgsrc/defs/base/numbers/number.st @@ -154,4 +154,8 @@ atRandom [ asChar [ ^Char new: (self asSmallInt) ] + +log2 [ + ^self asFloat log2 +] ! diff --git a/src/lstcore/lst_dpname.c b/src/lstcore/lst_dpname.c index 8cf20a3..62f2d4c 100644 --- a/src/lstcore/lst_dpname.c +++ b/src/lstcore/lst_dpname.c @@ -164,6 +164,8 @@ static const LSTPrimDef lstPrimList[] = { { 75, "StFinalizeCtl"}, { 76, "StWeakCtl"}, + +{ 77, "FloatFunc"}, {0} }; diff --git a/src/lstcore/lst_interp.c b/src/lstcore/lst_interp.c index 86c8ed0..6a3ca87 100644 --- a/src/lstcore/lst_interp.c +++ b/src/lstcore/lst_interp.c @@ -2355,6 +2355,23 @@ execComplete: /* low is the result */ retValue = lstNilObj; break; + case 77: /* FloatFunc float idx */ + if (low != 2) goto failPrimitiveArgs; + op1 = POPIT; /* idx */ + op = POPIT; /* float */ + if (!LST_IS_SMALLINT(op1)) goto failPrimitive; + tmp = lstIntValue(op1); + if (LST_IS_SMALLINT(op)) fop0 = lstIntValue(op); + else if (op->stclass == lstIntegerClass) fop0 = lstLIntValue(op); + else if (op->stclass == lstFloatClass) fop0 = lstFloatValue(op); + else goto failPrimitive; + switch (tmp) { + case 0: fop0 = log2(fop0); break; + default: goto failPrimitive; + } + retValue = lstNewFloat(fop0); + break; + default: /* save stack pointers */ l0 = lstRootTop; -- 2.11.4.GIT