Bläddra i källkod

Added a new disassemble method to closure class.

Marco Bambini 8 år sedan
förälder
incheckning
6ee2614ac1
3 ändrade filer med 29 tillägg och 29 borttagningar
  1. 17 21
      src/runtime/gravity_core.c
  2. 11 7
      src/utils/gravity_debug.c
  3. 1 1
      src/utils/gravity_debug.h

+ 17 - 21
src/runtime/gravity_core.c

@@ -10,6 +10,7 @@
 #include "gravity_core.h"
 #include "gravity_hash.h"
 #include "gravity_value.h"
+#include "gravity_debug.h"
 #include "gravity_opcodes.h"
 #include "gravity_macros.h"
 #include "gravity_memory.h"
@@ -627,26 +628,6 @@ static bool list_count (gravity_vm *vm, gravity_value_t *args, uint16_t nargs, u
 	RETURN_VALUE(VALUE_FROM_INT(marray_size(list->array)), rindex);
 }
 
-static bool list_contains (gravity_vm *vm, gravity_value_t *args, uint16_t nargs, uint32_t rindex) {
-	#pragma unused(vm, nargs)
-	gravity_list_t *list = VALUE_AS_LIST(GET_VALUE(0));
-	gravity_value_t element = GET_VALUE(1);
-	gravity_value_t result = VALUE_FROM_FALSE;
-	
-	register uint32_t count = (uint32_t)marray_size(list->array);
-	register gravity_int_t i = 0;
-
-	while (i < count) {
-		if (gravity_value_equals(marray_get(list->array, i), element)) {
-			result = VALUE_FROM_TRUE;
-			break;
-		}
-		i++;
-	}
-
-	RETURN_VALUE(result, rindex);
-}
-
 static bool list_loadat (gravity_vm *vm, gravity_value_t *args, uint16_t nargs, uint32_t rindex) {
 	#pragma unused(vm, nargs)
 	gravity_list_t	*list = VALUE_AS_LIST(GET_VALUE(0));
@@ -964,6 +945,19 @@ static bool class_exec (gravity_vm *vm, gravity_value_t *args, uint16_t nargs, u
 	RETURN_VALUE(VALUE_FROM_OBJECT(instance), rindex);
 }
 
+// MARK: - Closure Class -
+static bool closure_disassemble (gravity_vm *vm, gravity_value_t *args, uint16_t nargs, uint32_t rindex) {
+	#pragma unused(nargs)
+	
+	gravity_closure_t *closure = (gravity_closure_t *)(GET_VALUE(0).p);
+	if (closure->f->tag != EXEC_TYPE_NATIVE) RETURN_VALUE(VALUE_FROM_NULL, rindex);
+	
+	const char *buffer = gravity_disassemble((const char *)closure->f->bytecode, closure->f->ninsts, false);
+	if (!buffer) RETURN_VALUE(VALUE_FROM_NULL, rindex);
+	
+	RETURN_VALUE(gravity_string_to_value(vm, buffer, AUTOLENGTH), rindex);
+}
+
 // MARK: - Float Class -
 
 static bool operator_float_add (gravity_vm *vm, gravity_value_t *args, uint16_t nargs, uint32_t rindex) {
@@ -1643,6 +1637,9 @@ static void gravity_core_init (void) {
 	gravity_class_bind(gravity_class_class, "name", NEW_CLOSURE_VALUE(class_name));
 	gravity_class_bind(gravity_class_class, GRAVITY_INTERNAL_EXEC_NAME, NEW_CLOSURE_VALUE(class_exec));
 	
+	// CLOSURE CLASS
+	gravity_class_bind(gravity_class_closure, "disassemble", NEW_CLOSURE_VALUE(closure_disassemble));
+	
 	// LIST CLASS
 	gravity_class_bind(gravity_class_list, "count", VALUE_FROM_OBJECT(computed_property(NULL, NEW_FUNCTION(list_count), NULL)));
 	gravity_class_bind(gravity_class_list, ITERATOR_INIT_FUNCTION, NEW_CLOSURE_VALUE(list_iterator));
@@ -1652,7 +1649,6 @@ static void gravity_core_init (void) {
 	gravity_class_bind(gravity_class_list, GRAVITY_INTERNAL_LOOP_NAME, NEW_CLOSURE_VALUE(list_loop));
 	gravity_class_bind(gravity_class_list, "push", NEW_CLOSURE_VALUE(list_push));
 	gravity_class_bind(gravity_class_list, "pop", NEW_CLOSURE_VALUE(list_pop));
-	gravity_class_bind(gravity_class_list, "contains", NEW_CLOSURE_VALUE(list_contains));
 	
 	// MAP CLASS
 	gravity_class_bind(gravity_class_map, "keys", NEW_CLOSURE_VALUE(map_keys));

+ 11 - 7
src/utils/gravity_debug.c

@@ -48,7 +48,7 @@ const char *opcode_name (opcode_t op) {
 
 #define DUMP_VM_RAW(buffer, bindex, ...)				bindex += snprintf(&buffer[bindex], balloc-bindex, __VA_ARGS__);
 
-const char *gravity_disassemble (const char *bcode, uint32_t blen) {
+const char *gravity_disassemble (const char *bcode, uint32_t blen, bool deserialize) {
 	uint32_t	*ip = NULL;
 	uint32_t	pc = 0, inst = 0, ninsts = 0;
 	opcode_t	op;
@@ -58,10 +58,15 @@ const char *gravity_disassemble (const char *bcode, uint32_t blen) {
 	uint32_t	balloc = 0;
 	char		*buffer = NULL;
 	
-	// decode textual buffer to real bytecode
-	ip = gravity_bytecode_deserialize(bcode, blen, &ninsts);
-	if ((ip == NULL) || (ninsts == 0)) goto abort_disassemble;
-	
+	if (deserialize) {
+		// decode textual buffer to real bytecode
+		ip = gravity_bytecode_deserialize(bcode, blen, &ninsts);
+		if ((ip == NULL) || (ninsts == 0)) goto abort_disassemble;
+	} else {
+		ip = (uint32_t *)bcode;
+		ninsts = blen;
+	}
+		
 	// allocate a buffer big enought to fit all disassembled bytecode
 	// I assume that each instruction (each row) will be 256 chars long
 	balloc = ninsts * rowlen;
@@ -219,7 +224,6 @@ const char *gravity_disassemble (const char *bcode, uint32_t blen) {
 				
 			case RET0:
 			case RET: {
-				
 				if (op == RET0) {
 					DUMP_VM(buffer, bindex, "RET0");
 				} else {
@@ -288,7 +292,7 @@ const char *gravity_disassemble (const char *bcode, uint32_t blen) {
 	return buffer;
 	
 abort_disassemble:
-	if (ip) mem_free(ip);
+	if (ip && deserialize) mem_free(ip);
 	if (buffer) mem_free(buffer);
 	return NULL;
 }

+ 1 - 1
src/utils/gravity_debug.h

@@ -13,6 +13,6 @@
 
 const char *opcode_constname (int n);
 const char *opcode_name (opcode_t op);
-const char *gravity_disassemble (const char *bcode, uint32_t blen);
+const char *gravity_disassemble (const char *bcode, uint32_t blen, bool deserialize);
 
 #endif