compiler support for tuple expressions
This commit is contained in:
parent
3016b1be34
commit
f764c059fe
2
chunk.h
2
chunk.h
@ -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 {
|
||||
|
16
compiler.c
16
compiler.c
@ -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.");
|
||||
}
|
||||
|
1
debug.c
1
debug.c
@ -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
31
vm.c
@ -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:
|
||||
|
Loading…
x
Reference in New Issue
Block a user