浏览代码

Fake a password prompt and fix the problem with the return of a
create_node

Yentl Van Tendeloo 8 年之前
父节点
当前提交
9b0c783095

+ 16 - 5
core/core_algorithm.alc

@@ -172,8 +172,12 @@ Boolean function allow_group_modify(user_id : String, group_id : String):
 			return False!
 
 Boolean function check_login(user_id : String):
-	// TODO
-	return False!
+	String password
+
+	output("Password for existing user?")
+	password = input()
+
+	return True!
 
 Element function user_function():
 	String username
@@ -214,6 +218,7 @@ Element function user_function():
 			user_function_skip_init(user_id)
 
 	// User destroyed already, so just stop execution
+	// TODO return a fresh node as otherwise the compiler doesn't take this
 	return create_node()!
 
 String function get_model_id(name : String):
@@ -333,7 +338,8 @@ Void function user_function_skip_init(user_id : String):
 			output("    admin_demote                    -- Demote a user to normal status")
 			output("")
 			output("General operations")
-			output("    account_delete                  -- Remove current user and revoke all permissions ")
+			output("    self-destruct                   -- Remove current user and revoke all permissions ")
+			output("    exit                            -- Kill the current task, while retaining user")
 
 		elif (cmd == "model_add"):
 			// Model addition operation, which uses model upload commands of the compiler
@@ -1128,15 +1134,20 @@ Void function user_function_skip_init(user_id : String):
 			else:
 				output("Permission denied!")
 
+		elif (cmd == "self-destruct"):
+			// Delete user from Core Formalism
+			model_delete_element(core, user_id)
+			do_continue = False
+
 		elif (cmd == "exit"):
 			// Exit by actually removing the user and decoupling it from all of its models
 			// Restarting with the same user name will NOT grant you access to anything of the previous user with that same name
+			// as the current user will have been deleted
 			do_continue = False
+
 		else:
 			output("Unknown command: " + cmd)
 
-	// Delete user from Core Formalism
-	model_delete_element(core, user_id)
 	output("Goodbye!")
 
 	return !

+ 1 - 0
interface/HUTN/hutn_compiler/semantics_visitor.py

@@ -487,6 +487,7 @@ class SemanticsVisitor(Visitor):
     # there is no such rule in the grammar, we just avoid code duplicates
     def visit_id(self, tree):
         name = tree.get_text()
+        #TODO this is set to the function returnvalue, even if we use the function pointer...
         try:
             symbol = self.symbol_table.get(name)
         except KeyError:

+ 13 - 9
kernel/modelverse_kernel/legacy.py

@@ -569,15 +569,19 @@ class ModelverseKernel(object):
             self.debug_info[self.username].pop()
         user_frame, =       yield [("RD", [user_root, "frame"])]
         prev_frame, =       yield [("RD", [user_frame, "prev"])]
-        returnvalue, old_returnvalue_link = \
-                            yield [("RD", [user_frame, "returnvalue"]),
-                                   ("RDE", [prev_frame, "returnvalue"]),
-                                  ]
-        _, _, _, _ =        yield [("CD", [user_root, "frame", prev_frame]),
-                                   ("CD", [prev_frame, "returnvalue", returnvalue]),
-                                   ("DE", [old_returnvalue_link]),
-                                   ("DN", [user_frame]),
-                                  ]
+        if prev_frame is None:
+            _, =            yield [("DN", [user_root])]
+            del self.debug_info[self.username]
+        else:
+            returnvalue, old_returnvalue_link = \
+                                yield [("RD", [user_frame, "returnvalue"]),
+                                       ("RDE", [prev_frame, "returnvalue"]),
+                                      ]
+            _, _, _, _ =        yield [("CD", [user_root, "frame", prev_frame]),
+                                       ("CD", [prev_frame, "returnvalue", returnvalue]),
+                                       ("DE", [old_returnvalue_link]),
+                                       ("DN", [user_frame]),
+                                      ]
 
     def constant_init(self, user_root):
         user_frame, =       yield [("RD", [user_root, "frame"])]

+ 16 - 11
kernel/modelverse_kernel/main.py

@@ -124,16 +124,16 @@ class ModelverseKernel(object):
             else:
                 raise Exception("%s: error understanding command (%s, %s)" % (self.debug_info[username], inst_v, self.phase_v))
 
-        def handle_jit_failed(exception):
-            # Try again, but this time without the JIT.
-            # print(exception.message)
-            gen = self.get_inst_phase_generator(inst_v, self.phase_v, user_root)
-            yield [("TAIL_CALL", [gen])]
+            def handle_jit_failed(exception):
+                # Try again, but this time without the JIT.
+                # print(exception.message)
+                gen = self.get_inst_phase_generator(inst_v, self.phase_v, user_root)
+                yield [("TAIL_CALL", [gen])]
 
-        yield [("TRY", [])]
-        yield [("CATCH", [jit.JitCompilationFailedException, handle_jit_failed])]
-        yield [("CALL", [gen])]
-        yield [("END_TRY", [])]
+            yield [("TRY", [])]
+            yield [("CATCH", [jit.JitCompilationFailedException, handle_jit_failed])]
+            yield [("CALL", [gen])]
+            yield [("END_TRY", [])]
 
     def get_inst_phase_generator(self, inst_v, phase_v, user_root):
         """Gets a generator for the given instruction in the given phase,
@@ -620,9 +620,11 @@ class ModelverseKernel(object):
             # gives us O(1) state reads per jit-interpreter transition.
             exception_return, = yield [("RD", [user_frame, primitive_functions.EXCEPTION_RETURN_KEY])]
             if prev_frame is None:
+                print("Frame empty; delete user " + str(self.username))
                 _, =            yield [("DN", [user_root])]
                 del self.debug_info[self.username]
             else:
+                print("Previous frame found")
                 if self.debug_info[self.username]:
                     self.debug_info[self.username].pop()
                 _, _ =          yield [("CD", [user_root, "frame", prev_frame]),
@@ -654,8 +656,11 @@ class ModelverseKernel(object):
             self.debug_info[self.username].pop()
 
         user_frame, = yield [("RD", [user_root, "frame"])]
-        prev_frame, exception_return, returnvalue = yield [
-            ("RD", [user_frame, "prev"]),
+        prev_frame, = yield [("RD", [user_frame, "prev"])]
+        if prev_frame is None:
+            _, =            yield [("DN", [user_root])]
+            del self.debug_info[self.username]
+        exception_return, returnvalue = yield [
             ("RD", [user_frame, primitive_functions.EXCEPTION_RETURN_KEY]),
             ("RD", [user_frame, "returnvalue"])]
 

+ 3 - 1
scripts/execute_model.py

@@ -1,6 +1,7 @@
 import random
 import sys
 import multiprocessing
+import glob
 
 from compile import do_compile
 from link_and_load import link_and_load
@@ -11,8 +12,9 @@ code = []
 
 address = sys.argv[1]
 username = sys.argv[2]
+files = [a.replace("\\", "/") for a in sum([glob.glob(f) for f in sys.argv[3:]], [])]
 
-for f in sys.argv[3:]:
+for f in files:
     if f.endswith(".mvc"):
         models.append(f)
     elif f.endswith(".alc"):