浏览代码

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
 	Element selected_MM
 	String type
 	String type
 	Element reverse
 	Element reverse
+	Integer prev_length
 
 
 	// Read out some data first
 	// Read out some data first
 	if (set_len(models) == 0):
 	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'
 		// Add all elements from 'model', but prepend it with the 'model_name'
 		keys = dict_keys(model["model"])
 		keys = dict_keys(model["model"])
 		second_keys = set_create()
 		second_keys = set_create()
+		prev_length = -1
 
 
 		while (set_len(keys) > 0):
 		while (set_len(keys) > 0):
 			key = set_pop(keys)
 			key = set_pop(keys)
@@ -58,8 +60,13 @@ Element function model_fuse(models : Element):
 				instantiate_node(new_model, type, model_name + key)
 				instantiate_node(new_model, type, model_name + key)
 
 
 			if (set_len(keys) == 0):
 			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
 				keys = second_keys
 				second_keys = set_create()
 				second_keys = set_create()
+				prev_length = set_len(keys)
 
 
 	return new_model!
 	return new_model!
 
 
@@ -69,13 +76,15 @@ Element function model_copy(src_model : Element):
 	Element keys
 	Element keys
 	Element second_keys
 	Element second_keys
 	String type
 	String type
-
+	Integer prev_length
 	Element reverse
 	Element reverse
+
 	reverse = make_reverse_dictionary(src_model["model"])
 	reverse = make_reverse_dictionary(src_model["model"])
 
 
 	dst_model = instantiate_model(src_model["metamodel"])
 	dst_model = instantiate_model(src_model["metamodel"])
 	keys = dict_keys(src_model["model"])
 	keys = dict_keys(src_model["model"])
 	second_keys = set_create()
 	second_keys = set_create()
+	prev_length = -1
 
 
 	while (set_len(keys) > 0):
 	while (set_len(keys) > 0):
 		name = set_pop(keys)
 		name = set_pop(keys)
@@ -107,8 +116,13 @@ Element function model_copy(src_model : Element):
 			instantiate_node(dst_model, type, name)
 			instantiate_node(dst_model, type, name)
 
 
 		if (set_len(keys) == 0):
 		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
 			keys = second_keys
 			second_keys = set_create()
 			second_keys = set_create()
+			prev_length = set_len(keys)
 
 
 	return dst_model!
 	return dst_model!
 
 
@@ -125,6 +139,7 @@ Element function model_join(models : Element, metamodel : Element, tracability_m
 	String dst
 	String dst
 	String key
 	String key
 	String type
 	String type
+	Integer prev_length
 
 
 	new_model = instantiate_model(metamodel)
 	new_model = instantiate_model(metamodel)
 	elem_map = dict_create()
 	elem_map = dict_create()
@@ -142,6 +157,7 @@ Element function model_join(models : Element, metamodel : Element, tracability_m
 		// Add all elements from 'model'
 		// Add all elements from 'model'
 		keys = dict_keys(model["model"])
 		keys = dict_keys(model["model"])
 		second_keys = set_create()
 		second_keys = set_create()
+		prev_length = -1
 
 
 		while (set_len(keys) > 0):
 		while (set_len(keys) > 0):
 			// Copy the new element
 			// 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)
 				dict_add_fast(elem_map, cast_id(model["model"][key]), new_name)
 
 
 			if (set_len(keys) == 0):
 			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
 				keys = second_keys
 				second_keys = set_create()
 				second_keys = set_create()
+				prev_length = set_len(keys)
 
 
 	// Now link in the tracability model
 	// Now link in the tracability model
 	// Go over all TracabilityLink elements and connect them in the merged model as well
 	// 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 src_name
 	String dst_name
 	String dst_name
 	String new_name
 	String new_name
+	Integer prev_length
 
 
 	result = dict_create()
 	result = dict_create()
 	tracability_model = instantiate_model(import_node("models/Tracability"))
 	tracability_model = instantiate_model(import_node("models/Tracability"))
 	reverse = make_reverse_dictionary(merged_model["model"])
 	reverse = make_reverse_dictionary(merged_model["model"])
 	mapping = dict_create()
 	mapping = dict_create()
 	second_keys = set_create()
 	second_keys = set_create()
+	prev_length = -1
 
 
 	while (set_len(models) > 0):
 	while (set_len(models) > 0):
 		model_tuple = set_pop(models)
 		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))
 					dict_add_fast(mapping, key, instantiate_node(result[retyping_key], original_type, new_name))
 
 
 		if (set_len(keys) == 0):
 		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
 			keys = second_keys
 			second_keys = set_create()
 			second_keys = set_create()
+			prev_length = set_len(keys)
 
 
 	// Finally, we also add tracability information as a separate model
 	// Finally, we also add tracability information as a separate model
 	if (tracability):
 	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)
 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 author: Yentl Van Tendeloo
 Model name:   MvK Server
 Model name:   MvK Server