mirror of
https://github.com/zekexiao/pocketlang.git
synced 2025-02-11 15:16:41 +08:00
Merge pull request #86 from xSavitar/bitwise-not
Add support for bitwise NOT (~) operator to pocketlang
This commit is contained in:
commit
af55fe6811
@ -1217,6 +1217,14 @@ Var varBitRshift(PKVM* vm, Var v1, Var v2) {
|
|||||||
return VAR_NULL;
|
return VAR_NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Var varBitNot(PKVM* vm, Var v) {
|
||||||
|
int64_t i;
|
||||||
|
|
||||||
|
if (!validateInteger(vm, v, &i, "Unary operand")) return VAR_NULL;
|
||||||
|
|
||||||
|
return VAR_NUM((double)(~i));
|
||||||
|
}
|
||||||
|
|
||||||
bool varGreater(Var v1, Var v2) {
|
bool varGreater(Var v1, Var v2) {
|
||||||
double d1, d2;
|
double d1, d2;
|
||||||
|
|
||||||
|
@ -41,6 +41,7 @@ Var varBitOr(PKVM* vm, Var v1, Var v2); // Returns v1 | v2.
|
|||||||
Var varBitXor(PKVM* vm, Var v1, Var v2); // Returns v1 ^ v2.
|
Var varBitXor(PKVM* vm, Var v1, Var v2); // Returns v1 ^ v2.
|
||||||
Var varBitLshift(PKVM* vm, Var v1, Var v2); // Returns v1 << v2.
|
Var varBitLshift(PKVM* vm, Var v1, Var v2); // Returns v1 << v2.
|
||||||
Var varBitRshift(PKVM* vm, Var v1, Var v2); // Returns v1 >> v2.
|
Var varBitRshift(PKVM* vm, Var v1, Var v2); // Returns v1 >> v2.
|
||||||
|
Var varBitNot(PKVM* vm, Var v); // Returns ~v.
|
||||||
|
|
||||||
bool varGreater(Var v1, Var v2); // Returns v1 > v2.
|
bool varGreater(Var v1, Var v2); // Returns v1 > v2.
|
||||||
bool varLesser(Var v1, Var v2); // Returns v1 < v2.
|
bool varLesser(Var v1, Var v2); // Returns v1 < v2.
|
||||||
|
12
src/pk_vm.c
12
src/pk_vm.c
@ -1220,7 +1220,17 @@ static PkResult runFiber(PKVM* vm, Fiber* fiber) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
OPCODE(BIT_NOT):
|
OPCODE(BIT_NOT):
|
||||||
TODO;
|
{
|
||||||
|
// Don't pop yet, we need the reference for gc.
|
||||||
|
Var val = PEEK(-1);
|
||||||
|
|
||||||
|
Var result = varBitNot(vm, val);
|
||||||
|
DROP(); // val
|
||||||
|
PUSH(result);
|
||||||
|
|
||||||
|
CHECK_ERROR();
|
||||||
|
DISPATCH();
|
||||||
|
}
|
||||||
|
|
||||||
// Do not ever use PUSH(binaryOp(vm, POP(), POP()));
|
// Do not ever use PUSH(binaryOp(vm, POP(), POP()));
|
||||||
// Function parameters are not evaluated in a defined order in C.
|
// Function parameters are not evaluated in a defined order in C.
|
||||||
|
@ -73,6 +73,11 @@ assert(8 >> 1 == 0x4)
|
|||||||
assert(8 >> 2 == 0b10)
|
assert(8 >> 2 == 0b10)
|
||||||
assert(0xa >> 1 == 5)
|
assert(0xa >> 1 == 5)
|
||||||
|
|
||||||
|
assert(~8 == -9)
|
||||||
|
assert(~1 == -2)
|
||||||
|
assert(~0b0 == -1)
|
||||||
|
assert(~0x1 == -2)
|
||||||
|
|
||||||
x = 42 ; assert((x&=51) == 34)
|
x = 42 ; assert((x&=51) == 34)
|
||||||
x = 123 ; assert((x&=324) == 64)
|
x = 123 ; assert((x&=324) == 64)
|
||||||
for i in 0..1000
|
for i in 0..1000
|
||||||
|
Loading…
Reference in New Issue
Block a user