浏览代码

Add new test for strange models that are being managed (split/joined/...)

Yentl Van Tendeloo 7 年之前
父节点
当前提交
b912135454
共有 3 个文件被更改,包括 30 次插入2 次删除
  1. 二进制
      bootstrap/bootstrap.m.gz
  2. 29 1
      bootstrap/model_management.alc
  3. 1 1
      wrappers/modelverse_SCCD.py

二进制
bootstrap/bootstrap.m.gz


+ 29 - 1
bootstrap/model_management.alc

@@ -18,6 +18,7 @@ Element function model_fuse(models : Element):
 	Element selected_MM
 	String type
 	Element reverse
+	Integer prev_length
 
 	// Read out some data first
 	if (set_len(models) == 0):
@@ -38,6 +39,7 @@ Element function model_fuse(models : Element):
 		// Add all elements from 'model', but prepend it with the 'model_name'
 		keys = dict_keys(model["model"])
 		second_keys = set_create()
+		prev_length = -1
 
 		while (set_len(keys) > 0):
 			key = set_pop(keys)
@@ -58,8 +60,13 @@ Element function model_fuse(models : Element):
 				instantiate_node(new_model, type, model_name + key)
 
 			if (set_len(keys) == 0):
+				if (set_len(second_keys) == prev_length):
+					log("Cannot terminate model_fuse due to infinite recursion!")
+					return read_root()!
+
 				keys = second_keys
 				second_keys = set_create()
+				prev_length = set_len(keys)
 
 	return new_model!
 
@@ -69,13 +76,15 @@ Element function model_copy(src_model : Element):
 	Element keys
 	Element second_keys
 	String type
-
+	Integer prev_length
 	Element reverse
+
 	reverse = make_reverse_dictionary(src_model["model"])
 
 	dst_model = instantiate_model(src_model["metamodel"])
 	keys = dict_keys(src_model["model"])
 	second_keys = set_create()
+	prev_length = -1
 
 	while (set_len(keys) > 0):
 		name = set_pop(keys)
@@ -107,8 +116,13 @@ Element function model_copy(src_model : Element):
 			instantiate_node(dst_model, type, name)
 
 		if (set_len(keys) == 0):
+			if (set_len(second_keys) == prev_length):
+				log("Cannot terminate model_copy due to infinite recursion!")
+				return read_root()!
+
 			keys = second_keys
 			second_keys = set_create()
+			prev_length = set_len(keys)
 
 	return dst_model!
 
@@ -125,6 +139,7 @@ Element function model_join(models : Element, metamodel : Element, tracability_m
 	String dst
 	String key
 	String type
+	Integer prev_length
 
 	new_model = instantiate_model(metamodel)
 	elem_map = dict_create()
@@ -142,6 +157,7 @@ Element function model_join(models : Element, metamodel : Element, tracability_m
 		// Add all elements from 'model'
 		keys = dict_keys(model["model"])
 		second_keys = set_create()
+		prev_length = -1
 
 		while (set_len(keys) > 0):
 			// Copy the new element
@@ -168,8 +184,13 @@ Element function model_join(models : Element, metamodel : Element, tracability_m
 				dict_add_fast(elem_map, cast_id(model["model"][key]), new_name)
 
 			if (set_len(keys) == 0):
+				if (set_len(second_keys) == prev_length):
+					log("Cannot terminate model_join due to infinite recursion!")
+					return read_root()!
+
 				keys = second_keys
 				second_keys = set_create()
+				prev_length = set_len(keys)
 
 	// Now link in the tracability model
 	// Go over all TracabilityLink elements and connect them in the merged model as well
@@ -245,12 +266,14 @@ Element function model_split(merged_model : Element, models : Element, tracabili
 	String src_name
 	String dst_name
 	String new_name
+	Integer prev_length
 
 	result = dict_create()
 	tracability_model = instantiate_model(import_node("models/Tracability"))
 	reverse = make_reverse_dictionary(merged_model["model"])
 	mapping = dict_create()
 	second_keys = set_create()
+	prev_length = -1
 
 	while (set_len(models) > 0):
 		model_tuple = set_pop(models)
@@ -322,8 +345,13 @@ Element function model_split(merged_model : Element, models : Element, tracabili
 					dict_add_fast(mapping, key, instantiate_node(result[retyping_key], original_type, new_name))
 
 		if (set_len(keys) == 0):
+			if (set_len(second_keys) == prev_length):
+				log("Cannot terminate model_split due to infinite recursion!")
+				return read_root()!
+
 			keys = second_keys
 			second_keys = set_create()
+			prev_length = set_len(keys)
 
 	// Finally, we also add tracability information as a separate model
 	if (tracability):

+ 1 - 1
wrappers/modelverse_SCCD.py

@@ -1,7 +1,7 @@
 """
 Generated by Statechart compiler by Glenn De Jonghe, Joeri Exelmans, Simon Van Mierlo, and Yentl Van Tendeloo (for the inspiration)
 
-Date:   Mon Mar 12 10:07:55 2018
+Date:   Tue Mar 20 15:56:14 2018
 
 Model author: Yentl Van Tendeloo
 Model name:   MvK Server