Browse Source

Improved gravity_object_deserialize API.

Marco Bambini 8 years ago
parent
commit
75df7560a8
3 changed files with 19 additions and 28 deletions
  1. 2 3
      src/runtime/gravity_vm.c
  2. 16 24
      src/shared/gravity_value.c
  3. 1 1
      src/shared/gravity_value.h

+ 2 - 3
src/runtime/gravity_vm.c

@@ -1758,9 +1758,8 @@ gravity_closure_t *gravity_vm_loadbuffer (gravity_vm *vm, const char *buffer, si
 		// each entry must be an object
 		if (entry->type != json_object) goto abort_load;
 		
-		gravity_object_t *obj = NULL;
-		if (!gravity_object_deserialize(vm, entry, &obj)) goto abort_load;
-		if (!obj) continue;
+		gravity_object_t *obj = gravity_object_deserialize(vm, entry);
+		if (!obj) goto abort_load;
 		
 		// save object for further processing
 		marray_push(void*, objects, obj);

+ 16 - 24
src/shared/gravity_value.c

@@ -325,12 +325,12 @@ gravity_class_t *gravity_class_deserialize (gravity_vm *vm, json_value *json) {
 				for (uint32_t j=0; j<m; ++j) {
 					json_value *r = value->u.array.values[j];
 					if (r->type != json_object) continue;
-					gravity_object_t *obj = NULL;
-					bool result = gravity_object_deserialize(vm, r, &obj);
+					gravity_object_t *obj = gravity_object_deserialize(vm, r);
+					if (!obj) goto abort_load;
 					
 					const char *identifier = obj->identifier;
 					if (OBJECT_ISA_FUNCTION(obj)) obj = (gravity_object_t *)gravity_closure_new(vm, (gravity_function_t *)obj);
-					if ((result) && (obj)) gravity_class_bind(meta, identifier, VALUE_FROM_OBJECT(obj));
+					if (obj) gravity_class_bind(meta, identifier, VALUE_FROM_OBJECT(obj));
 					else goto abort_load;
 				}
 				continue;
@@ -341,8 +341,7 @@ gravity_class_t *gravity_class_deserialize (gravity_vm *vm, json_value *json) {
 		}
 		
 		if (value->type == json_object) {
-			gravity_object_t *obj = NULL;
-			if (!gravity_object_deserialize(vm, value, &obj)) goto abort_load;
+			gravity_object_t *obj = gravity_object_deserialize(vm, value);
 			if (!obj) goto abort_load;
 			
 			const char *identifier = obj->identifier;
@@ -841,10 +840,9 @@ gravity_function_t *gravity_function_deserialize (gravity_vm *vm, json_value *js
 						break;
 						
 					case json_object: {
-						gravity_object_t *obj = NULL;
-						bool result = gravity_object_deserialize(vm, r, &obj);
-						if ((result) && (obj)) gravity_function_cpool_add(NULL, f, VALUE_FROM_OBJECT(obj));
-						else goto abort_load;
+						gravity_object_t *obj = gravity_object_deserialize(vm, r);
+						if (!obj) goto abort_load;
+						gravity_function_cpool_add(NULL, f, VALUE_FROM_OBJECT(obj));
 						break;
 					}
 						
@@ -1147,48 +1145,42 @@ void gravity_object_serialize (gravity_object_t *obj, json_t *json) {
 	else assert(0);
 }
 
-bool gravity_object_deserialize (gravity_vm *vm, json_value *entry, gravity_object_t **obj) {
+gravity_object_t *gravity_object_deserialize (gravity_vm *vm, json_value *entry) {
 	// this function is able to deserialize ONLY objects with a type label
 	
 	// sanity check
-	if (entry->type != json_object) return false;
-	if (entry->u.object.length == 0) return false;
+	if (entry->type != json_object) return NULL;
+	if (entry->u.object.length == 0) return NULL;
 	
 	// the first entry value must specify gravity object type
 	const char *label = entry->u.object.values[0].name;
 	json_value *value = entry->u.object.values[0].value;
 	
-	if (string_casencmp(label, GRAVITY_JSON_LABELTYPE, 4) != 0) return false;
-	if (value->type != json_string) return false;
+	if (string_casencmp(label, GRAVITY_JSON_LABELTYPE, 4) != 0) return NULL;
+	if (value->type != json_string) return NULL;
 	
 	// FUNCTION case
 	if (string_casencmp(value->u.string.ptr, GRAVITY_JSON_FUNCTION, value->u.string.length) == 0) {
 		gravity_function_t *f = gravity_function_deserialize(vm, entry);
-		if (!f) return false;
-		*obj = (gravity_object_t *)f;
-		return true;
+		return (gravity_object_t *)f;
 	}
 	
 	// CLASS case
 	if (string_casencmp(value->u.string.ptr, GRAVITY_JSON_CLASS, value->u.string.length) == 0) {
 		gravity_class_t *c = gravity_class_deserialize(vm, entry);
-		if (!c) return false;
-		*obj = (gravity_object_t *)c;
-		return true;
+		return (gravity_object_t *)c;
 	}
 	
 	// MAP/ENUM case
 	if ((string_casencmp(value->u.string.ptr, GRAVITY_JSON_MAP, value->u.string.length) == 0) ||
 		(string_casencmp(value->u.string.ptr, GRAVITY_JSON_ENUM, value->u.string.length) == 0)) {
 		gravity_map_t *m = gravity_map_deserialize(vm, entry);
-		if (!m) return false;
-		*obj = (gravity_object_t *)m;
-		return true;
+		return (gravity_object_t *)m;
 	}
 	
 	// unhandled case
 	DEBUG_DESERIALIZE("gravity_object_deserialize unknown type");
-	return false;
+	return NULL;
 }
 #undef REPORT_JSON_ERROR
 

+ 1 - 1
src/shared/gravity_value.h

@@ -455,7 +455,7 @@ GRAVITY_API uint32_t			gravity_value_size (gravity_vm *vm, gravity_value_t v);
 
 // MARK: - OBJECT -
 GRAVITY_API void				gravity_object_serialize (gravity_object_t *obj, json_t *json);
-GRAVITY_API bool				gravity_object_deserialize (gravity_vm *vm, json_value *entry, gravity_object_t **obj);
+GRAVITY_API gravity_object_t	*gravity_object_deserialize (gravity_vm *vm, json_value *entry);
 GRAVITY_API void				gravity_object_free (gravity_vm *vm, gravity_object_t *obj);
 GRAVITY_API void				gravity_object_blacken (gravity_vm *vm, gravity_object_t *obj);
 GRAVITY_API uint32_t			gravity_object_size (gravity_vm *vm, gravity_object_t *obj);