compiler support for tuple expressions

This commit is contained in:
K. Lange 2021-01-05 12:03:21 +09:00
parent 3016b1be34
commit f764c059fe
4 changed files with 46 additions and 4 deletions

View File

@ -70,6 +70,7 @@ typedef enum {
OP_EXPAND_ARGS,
OP_FINALIZE,
OP_TUPLE,
OP_CONSTANT_LONG = 128,
OP_DEFINE_GLOBAL_LONG,
@ -89,6 +90,7 @@ typedef enum {
OP_GET_SUPER_LONG,
OP_INC_LONG,
OP_KWARGS_LONG,
OP_TUPLE_LONG,
} KrkOpCode;
typedef struct {

View File

@ -1351,7 +1351,21 @@ static void statement() {
static void grouping(int canAssign) {
startEatingWhitespace();
expression();
if (check(TOKEN_RIGHT_PAREN)) {
emitBytes(OP_TUPLE,0);
} else {
expression();
if (match(TOKEN_COMMA)) {
size_t argCount = 1;
if (!check(TOKEN_RIGHT_PAREN)) {
do {
expression();
argCount++;
} while (match(TOKEN_COMMA) && !check(TOKEN_RIGHT_PAREN));
}
EMIT_CONSTANT_OP(OP_TUPLE, argCount);
}
}
stopEatingWhitespace();
consume(TOKEN_RIGHT_PAREN, "Expect ')' after expression.");
}

View File

@ -116,6 +116,7 @@ size_t krk_disassembleInstruction(KrkChunk * chunk, size_t offset) {
OPERAND(OP_GET_UPVALUE)
OPERAND(OP_CALL)
OPERAND(OP_INC)
OPERAND(OP_TUPLE)
JUMP(OP_JUMP,+)
JUMP(OP_JUMP_IF_FALSE,+)
JUMP(OP_JUMP_IF_TRUE,+)

31
vm.c
View File

@ -1876,11 +1876,16 @@ static KrkValue _bound_get_file(int argc, KrkValue argv[]) {
return _closure_get_file(1, (KrkValue[]){OBJECT_VAL(boundMethod->method)});
}
/* tuple.__init__ */
static KrkValue _tuple_init(int argc, KrkValue argv[]) {
KrkTuple * self = krk_newTuple(argc-1);
krk_runtimeError(vm.exceptions.typeError,"tuple() initializier unsupported");
return NONE_VAL();
}
/* tuple creator */
static KrkValue _tuple_of(int argc, KrkValue argv[]) {
KrkTuple * self = krk_newTuple(argc);
krk_push(OBJECT_VAL(self));
for (size_t i = 1; i < (size_t)argc; ++i) {
for (size_t i = 0; i < (size_t)argc; ++i) {
self->values.values[self->values.count++] = argv[i];
}
krk_pop();
@ -1948,6 +1953,11 @@ static KrkValue _tuple_repr(int argc, KrkValue argv[]) {
}
}
if (tuple->values.count == 1) {
krk_push(OBJECT_VAL(S(",")));
addObjects();
}
krk_push(OBJECT_VAL(S(")")));
addObjects();
tuple->inrepr = 0;
@ -3263,6 +3273,21 @@ static KrkValue run() {
krk_push(KWARGS_VAL(readBytes(frame,operandWidth)));
break;
}
case OP_TUPLE_LONG:
case OP_TUPLE: {
size_t count = readBytes(frame, operandWidth);
KrkValue tuple = _tuple_of(count,&vm.stackTop[-count]);
if (count) {
vm.stackTop[-count] = tuple;
while (count > 1) {
krk_pop();
count--;
}
} else {
krk_push(tuple);
}
break;
}
}
if (!(vm.flags & KRK_HAS_EXCEPTION)) continue;
_finishException: