Browse Source

Added list allocate and map.hasKey methods (with unit test).

Marco Bambini 8 years ago
parent
commit
0e034010e8
3 changed files with 46 additions and 0 deletions
  1. 23 0
      src/runtime/gravity_core.c
  2. 9 0
      test/list_allocate.gravity
  3. 14 0
      test/map_haskey.gravity

+ 23 - 0
src/runtime/gravity_core.c

@@ -818,6 +818,16 @@ static bool list_join (gravity_vm *vm, gravity_value_t *args, uint16_t nargs, ui
 	RETURN_VALUE(VALUE_FROM_OBJECT(result), rindex);
 }
 
+static bool list_exec (gravity_vm *vm, gravity_value_t *args, uint16_t nargs, uint32_t rindex) {
+    if ((nargs != 2) || (!VALUE_ISA_INT(GET_VALUE(1)))) RETURN_ERROR("An Int value is expected as argument of List allocate.");
+    
+    uint32_t n = (uint32_t)VALUE_AS_INT(GET_VALUE(1));
+    gravity_list_t *list = gravity_list_new(vm, n);
+    for (uint32_t i=0; i<n; ++i) marray_push(gravity_value_t, list->array, VALUE_FROM_NULL);
+    
+    RETURN_VALUE(VALUE_FROM_OBJECT(list), rindex);
+}
+
 // MARK: - Map Class -
 
 static bool map_count (gravity_vm *vm, gravity_value_t *args, uint16_t nargs, uint32_t rindex) {
@@ -851,6 +861,15 @@ static bool map_loadat (gravity_vm *vm, gravity_value_t *args, uint16_t nargs, u
 	RETURN_VALUE((value) ? *value : VALUE_FROM_NULL, rindex);
 }
 
+static bool map_haskey (gravity_vm *vm, gravity_value_t *args, uint16_t nargs, uint32_t rindex) {
+    #pragma unused(vm, nargs)
+    gravity_map_t *map = VALUE_AS_MAP(GET_VALUE(0));
+    gravity_value_t key = GET_VALUE(1);
+    
+    gravity_value_t *value = gravity_hash_lookup(map->hash, key);
+    RETURN_VALUE((value) ? VALUE_FROM_TRUE : VALUE_FROM_FALSE, rindex);
+}
+
 static bool map_storeat (gravity_vm *vm, gravity_value_t *args, uint16_t nargs, uint32_t rindex) {
 	#pragma unused(vm, nargs, rindex)
 	gravity_map_t *map = VALUE_AS_MAP(GET_VALUE(0));
@@ -2069,6 +2088,9 @@ static void gravity_core_init (void) {
 	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));
+    // Meta
+    gravity_class_t *list_meta = gravity_class_get_meta(gravity_class_list);
+    gravity_class_bind(list_meta, GRAVITY_INTERNAL_EXEC_NAME, NEW_CLOSURE_VALUE(list_exec));
 	
 	// MAP CLASS
 	gravity_class_bind(gravity_class_map, "keys", NEW_CLOSURE_VALUE(map_keys));
@@ -2077,6 +2099,7 @@ static void gravity_core_init (void) {
 	gravity_class_bind(gravity_class_map, GRAVITY_INTERNAL_LOOP_NAME, NEW_CLOSURE_VALUE(map_loop));
 	gravity_class_bind(gravity_class_map, GRAVITY_INTERNAL_LOADAT_NAME, NEW_CLOSURE_VALUE(map_loadat));
 	gravity_class_bind(gravity_class_map, GRAVITY_INTERNAL_STOREAT_NAME, NEW_CLOSURE_VALUE(map_storeat));
+    gravity_class_bind(gravity_class_map, "hasKey", NEW_CLOSURE_VALUE(map_haskey));
 	#if GRAVITY_MAP_DOTSUGAR
 	gravity_class_bind(gravity_class_map, GRAVITY_INTERNAL_LOAD_NAME, NEW_CLOSURE_VALUE(map_loadat));
 	gravity_class_bind(gravity_class_map, GRAVITY_INTERNAL_STORE_NAME, NEW_CLOSURE_VALUE(map_storeat));

+ 9 - 0
test/list_allocate.gravity

@@ -0,0 +1,9 @@
+#unittest {
+	name: "List allocation.";
+	result: 40;
+};
+
+func main() {
+    var list = List(40);
+    return list.count;
+}

+ 14 - 0
test/map_haskey.gravity

@@ -0,0 +1,14 @@
+#unittest {
+	name: "Map hasKey method.";
+	result: 2;
+};
+
+func main() {
+	var n = 0;
+	var map = ["key1":1, "key2":2, "key3":3];
+    
+    if (map.hasKey("key3")) n += 1;
+    if (!map.hasKey("key4")) n += 1;
+    
+    return n;
+}