Prechádzať zdrojové kódy

Enabled GRAVITY_MAP_DOTSUGAR by default.

Updated unit test according to the new settings.
Map values can now be access using the dot notation instead of the
square bracket way.
Marco Bambini 8 rokov pred
rodič
commit
5603619b5b

+ 24 - 0
src/runtime/gravity_core.c

@@ -1062,6 +1062,25 @@ static bool map_loadat (gravity_vm *vm, gravity_value_t *args, uint16_t nargs, u
 	gravity_value_t key = GET_VALUE(1);
 	if (VALUE_ISA_NOTVALID(key)) RETURN_ERROR("Invalid map key.");
 	
+    #ifdef GRAVITY_MAP_DOTSUGAR
+    gravity_object_t *obj = (gravity_object_t *)gravity_class_lookup(gravity_class_map, key);
+    if (obj) {
+        if (OBJECT_ISA_CLOSURE(obj)) {
+            gravity_closure_t *closure = (gravity_closure_t *)obj;
+            if (closure && closure->f) {
+                // execute optimized default getter
+                if (FUNCTION_ISA_SPECIAL(closure->f)) {
+                    if (FUNCTION_ISA_GETTER(closure->f)) {
+                        // returns a function to be executed using the return false trick
+                        RETURN_CLOSURE(VALUE_FROM_OBJECT((gravity_closure_t *)closure->f->special[EXEC_TYPE_SPECIAL_GETTER]), rindex);
+                    }
+                }
+            }
+        }
+        RETURN_VALUE(VALUE_FROM_OBJECT(obj), rindex);
+    }
+    #endif
+    
 	gravity_value_t *value = gravity_hash_lookup(map->hash, key);
 	RETURN_VALUE((value) ? *value : VALUE_FROM_NULL, rindex);
 }
@@ -1081,6 +1100,11 @@ static bool map_storeat (gravity_vm *vm, gravity_value_t *args, uint16_t nargs,
 	gravity_value_t key = GET_VALUE(1);
 	gravity_value_t value = GET_VALUE(2);
 	
+//    #ifdef GRAVITY_MAP_DOTSUGAR
+//    gravity_object_t *obj = (gravity_object_t *)gravity_class_lookup(gravity_class_map, key);
+//    if (obj) RETURN_VALUE(VALUE_FROM_OBJECT(obj), rindex);
+//    #endif
+	
 	gravity_hash_insert(map->hash, key, value);
 	RETURN_NOVALUE();
 }

+ 3 - 3
src/shared/gravity_value.h

@@ -66,15 +66,15 @@
 extern "C" {
 #endif
 
-#define GRAVITY_VERSION						"0.2.8"     // git tag 0.2.8
-#define GRAVITY_VERSION_NUMBER				0x000208    // git push --tags
+#define GRAVITY_VERSION						"0.3.0"     // git tag 0.3.0
+#define GRAVITY_VERSION_NUMBER				0x000300    // git push --tags
 #define GRAVITY_BUILD_DATE					__DATE__
 
 #define GRAVITY_ENABLE_DOUBLE				1			// if 1 enable gravity_float_t to be a double (instead of a float)
 #define GRAVITY_ENABLE_INT64				1			// if 1 enable gravity_int_t to be a 64bit int (intead of a 32bit int)
 #define GRAVITY_COMPUTED_GOTO				1			// if 1 enable faster computed goto (instead of switch) for compilers that support it
 #define GRAVITY_NULL_SILENT					1			// if 1 then messages sent to null does not produce any runtime error
-#define GRAVITY_MAP_DOTSUGAR				0			// if 1 then map objects can be accessed with both map[key] and map.key
+#define GRAVITY_MAP_DOTSUGAR				1			// if 1 then map objects can be accessed with both map[key] and map.key
 
 #ifdef _MSC_VER
 #undef GRAVITY_COMPUTED_GOTO

+ 3 - 2
test/unittest/list_remove.gravity

@@ -1,11 +1,12 @@
 #unittest {
     name: "List remove.";
-    result: [20,30];
+    result: "[20,30]";
 };
 
 func main() {
     var r = [10,20,30,40,50];
     r.remove(0);
     r.remove(3);
-    return r.remove(2);
+    r.remove(2)
+    return r.String();
 }

+ 2 - 2
test/unittest/map_access.gravity

@@ -5,6 +5,6 @@
 };
 
 func main() {
-	var map = ["Andrea":22, "Marco":23, "count":666];
-	return map.count + map["count"];
+	var map = ["Andrea":22, "Marco":23, "test":666];
+	return map.count + map["test"];
 }

+ 5 - 2
test/unittest/map_count_redeclared.gravity

@@ -1,8 +1,11 @@
 #unittest {
-	name: "Map count redeclared.";
-	result: 669;
+	name: "Map count redeclared (when GRAVITY_MAP_DOTSUGAR is set to 1).";
+	result: 6;
 };
 
+// result is 669 when GRAVITY_MAP_DOTSUGAR macro is 0
+// result is 6 when GRAVITY_MAP_DOTSUGAR macro is 1
+
 func main() {
 	var map = ["Andrea":22, "Marco":23, "count":666];
 	return map.count + map["count"];