Cache jump targets in a hash/set
This commit is contained in:
parent
1928fa6b0c
commit
864cda1bed
1
Makefile
1
Makefile
@ -133,6 +133,7 @@ src/debug.o: src/opcodes.h
|
|||||||
src/value.o: src/opcodes.h
|
src/value.o: src/opcodes.h
|
||||||
src/vm.o: src/opcodes.h
|
src/vm.o: src/opcodes.h
|
||||||
src/exceptions.o: src/opcodes.h
|
src/exceptions.o: src/opcodes.h
|
||||||
|
modules/dis.so: src/opcodes.h
|
||||||
|
|
||||||
|
|
||||||
%.o: %.c ${HEADERS}
|
%.o: %.c ${HEADERS}
|
||||||
|
11
src/debug.c
11
src/debug.c
@ -197,6 +197,8 @@ static int isJumpTarget(KrkCodeObject * func, size_t startPoint) {
|
|||||||
KrkChunk * chunk = &func->chunk;
|
KrkChunk * chunk = &func->chunk;
|
||||||
size_t offset = 0;
|
size_t offset = 0;
|
||||||
|
|
||||||
|
if (IS_NONE(func->jumpTargets)) {
|
||||||
|
func->jumpTargets = krk_dict_of(0,NULL,0);
|
||||||
#define SIMPLE(opc) case opc: size = 1; break;
|
#define SIMPLE(opc) case opc: size = 1; break;
|
||||||
#define CONSTANT(opc,more) case opc: { size_t constant _unused = chunk->code[offset + 1]; size = 2; more; break; } \
|
#define CONSTANT(opc,more) case opc: { size_t constant _unused = chunk->code[offset + 1]; size = 2; more; break; } \
|
||||||
case opc ## _LONG: { size_t constant _unused = (chunk->code[offset + 1] << 16) | \
|
case opc ## _LONG: { size_t constant _unused = (chunk->code[offset + 1] << 16) | \
|
||||||
@ -205,7 +207,7 @@ static int isJumpTarget(KrkCodeObject * func, size_t startPoint) {
|
|||||||
#define OPERAND(opc,more) OPERANDB(opc,more) \
|
#define OPERAND(opc,more) OPERANDB(opc,more) \
|
||||||
case opc ## _LONG: { size = 4; more; break; }
|
case opc ## _LONG: { size = 4; more; break; }
|
||||||
#define JUMP(opc,sign) case opc: { uint16_t jump = (chunk->code[offset + 1] << 8) | (chunk->code[offset + 2]); \
|
#define JUMP(opc,sign) case opc: { uint16_t jump = (chunk->code[offset + 1] << 8) | (chunk->code[offset + 2]); \
|
||||||
if ((size_t)(offset + 3 sign jump) == startPoint) return 1; \
|
krk_tableSet(AS_DICT(func->jumpTargets), INTEGER_VAL((size_t)(offset + 3 sign jump)), BOOLEAN_VAL(1)); \
|
||||||
size = 3; break; }
|
size = 3; break; }
|
||||||
#define CLOSURE_MORE \
|
#define CLOSURE_MORE \
|
||||||
KrkCodeObject * function = AS_codeobject(chunk->constants.values[constant]); \
|
KrkCodeObject * function = AS_codeobject(chunk->constants.values[constant]); \
|
||||||
@ -228,7 +230,6 @@ static int isJumpTarget(KrkCodeObject * func, size_t startPoint) {
|
|||||||
}
|
}
|
||||||
offset += size;
|
offset += size;
|
||||||
}
|
}
|
||||||
return 0;
|
|
||||||
#undef SIMPLE
|
#undef SIMPLE
|
||||||
#undef OPERANDB
|
#undef OPERANDB
|
||||||
#undef OPERAND
|
#undef OPERAND
|
||||||
@ -240,6 +241,12 @@ static int isJumpTarget(KrkCodeObject * func, size_t startPoint) {
|
|||||||
#undef FORMAT_VALUE_MORE
|
#undef FORMAT_VALUE_MORE
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!IS_dict(func->jumpTargets)) return 0;
|
||||||
|
KrkValue garbage;
|
||||||
|
if (krk_tableGet(AS_DICT(func->jumpTargets), INTEGER_VAL(startPoint), &garbage)) return 1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
#define OPARGS FILE * f, const char * fullName, size_t * size, size_t * offset, KrkCodeObject * func, KrkChunk * chunk
|
#define OPARGS FILE * f, const char * fullName, size_t * size, size_t * offset, KrkCodeObject * func, KrkChunk * chunk
|
||||||
#define OPARG_VALS f,fullName,size,offset,func,chunk
|
#define OPARG_VALS f,fullName,size,offset,func,chunk
|
||||||
|
|
||||||
|
@ -173,6 +173,7 @@ typedef struct {
|
|||||||
size_t expressionsCapacity; /**< @brief Capacity of @ref expressions */
|
size_t expressionsCapacity; /**< @brief Capacity of @ref expressions */
|
||||||
size_t expressionsCount; /**< @brief Number of entries in @ref expressions */
|
size_t expressionsCount; /**< @brief Number of entries in @ref expressions */
|
||||||
KrkExpressionsMap * expressions; /**< @brief Mapping of bytecode offsets to expression spans for debugging */
|
KrkExpressionsMap * expressions; /**< @brief Mapping of bytecode offsets to expression spans for debugging */
|
||||||
|
KrkValue jumpTargets; /**< @brief Possibly a set of jump targets... */
|
||||||
} KrkCodeObject;
|
} KrkCodeObject;
|
||||||
|
|
||||||
|
|
||||||
|
@ -365,6 +365,7 @@ static void blackenObject(KrkObj * object) {
|
|||||||
for (size_t i = 0; i < function->localNameCount; ++i) {
|
for (size_t i = 0; i < function->localNameCount; ++i) {
|
||||||
krk_markObject((KrkObj*)function->localNames[i].name);
|
krk_markObject((KrkObj*)function->localNames[i].name);
|
||||||
}
|
}
|
||||||
|
krk_markValue(function->jumpTargets);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case KRK_OBJ_UPVALUE:
|
case KRK_OBJ_UPVALUE:
|
||||||
|
@ -274,6 +274,7 @@ KrkCodeObject * krk_newCodeObject(void) {
|
|||||||
krk_initValueArray(&codeobject->positionalArgNames);
|
krk_initValueArray(&codeobject->positionalArgNames);
|
||||||
krk_initValueArray(&codeobject->keywordArgNames);
|
krk_initValueArray(&codeobject->keywordArgNames);
|
||||||
krk_initChunk(&codeobject->chunk);
|
krk_initChunk(&codeobject->chunk);
|
||||||
|
codeobject->jumpTargets = NONE_VAL();
|
||||||
return codeobject;
|
return codeobject;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user