forked from lix-project/lix
Merge pull request #2157 from volth/bitwise
add builtins: __bitAnd, __bitOr, __bitXor
This commit is contained in:
commit
743359bc8a
|
@ -92,6 +92,36 @@ available as <function>builtins.derivation</function>.</para>
|
|||
</varlistentry>
|
||||
|
||||
|
||||
<varlistentry><term><function>builtins.bitAnd</function>
|
||||
<replaceable>e1</replaceable> <replaceable>e2</replaceable></term>
|
||||
|
||||
<listitem><para>Return the bitwise AND of the integers
|
||||
<replaceable>e1</replaceable> and
|
||||
<replaceable>e2</replaceable>.</para></listitem>
|
||||
|
||||
</varlistentry>
|
||||
|
||||
|
||||
<varlistentry><term><function>builtins.bitOr</function>
|
||||
<replaceable>e1</replaceable> <replaceable>e2</replaceable></term>
|
||||
|
||||
<listitem><para>Return the bitwise OR of the integers
|
||||
<replaceable>e1</replaceable> and
|
||||
<replaceable>e2</replaceable>.</para></listitem>
|
||||
|
||||
</varlistentry>
|
||||
|
||||
|
||||
<varlistentry><term><function>builtins.bitXor</function>
|
||||
<replaceable>e1</replaceable> <replaceable>e2</replaceable></term>
|
||||
|
||||
<listitem><para>Return the bitwise XOR of the integers
|
||||
<replaceable>e1</replaceable> and
|
||||
<replaceable>e2</replaceable>.</para></listitem>
|
||||
|
||||
</varlistentry>
|
||||
|
||||
|
||||
<varlistentry><term><varname>builtins</varname></term>
|
||||
|
||||
<listitem><para>The set <varname>builtins</varname> contains all
|
||||
|
|
|
@ -1676,6 +1676,20 @@ static void prim_div(EvalState & state, const Pos & pos, Value * * args, Value &
|
|||
}
|
||||
}
|
||||
|
||||
static void prim_bitAnd(EvalState & state, const Pos & pos, Value * * args, Value & v)
|
||||
{
|
||||
mkInt(v, state.forceInt(*args[0], pos) & state.forceInt(*args[1], pos));
|
||||
}
|
||||
|
||||
static void prim_bitOr(EvalState & state, const Pos & pos, Value * * args, Value & v)
|
||||
{
|
||||
mkInt(v, state.forceInt(*args[0], pos) | state.forceInt(*args[1], pos));
|
||||
}
|
||||
|
||||
static void prim_bitXor(EvalState & state, const Pos & pos, Value * * args, Value & v)
|
||||
{
|
||||
mkInt(v, state.forceInt(*args[0], pos) ^ state.forceInt(*args[1], pos));
|
||||
}
|
||||
|
||||
static void prim_lessThan(EvalState & state, const Pos & pos, Value * * args, Value & v)
|
||||
{
|
||||
|
@ -2221,6 +2235,9 @@ void EvalState::createBaseEnv()
|
|||
addPrimOp("__sub", 2, prim_sub);
|
||||
addPrimOp("__mul", 2, prim_mul);
|
||||
addPrimOp("__div", 2, prim_div);
|
||||
addPrimOp("__bitAnd", 2, prim_bitAnd);
|
||||
addPrimOp("__bitOr", 2, prim_bitOr);
|
||||
addPrimOp("__bitXor", 2, prim_bitXor);
|
||||
addPrimOp("__lessThan", 2, prim_lessThan);
|
||||
|
||||
// String manipulation
|
||||
|
|
|
@ -1 +1 @@
|
|||
2188
|
||||
2216
|
||||
|
|
|
@ -26,6 +26,10 @@ let {
|
|||
(56088 / 123 / 2)
|
||||
(3 + 4 * const 5 0 - 6 / id 2)
|
||||
|
||||
(builtins.bitAnd 12 10) # 0b1100 & 0b1010 = 8
|
||||
(builtins.bitOr 12 10) # 0b1100 | 0b1010 = 14
|
||||
(builtins.bitXor 12 10) # 0b1100 ^ 0b1010 = 6
|
||||
|
||||
(if 3 < 7 then 1 else err)
|
||||
(if 7 < 3 then err else 1)
|
||||
(if 3 < 3 then err else 1)
|
||||
|
|
Loading…
Reference in a new issue