X-Git-Url: http://nitlanguage.org diff --git a/src/interpreter/debugger.nit b/src/interpreter/debugger.nit index 684ea87..1765d9e 100644 --- a/src/interpreter/debugger.nit +++ b/src/interpreter/debugger.nit @@ -225,6 +225,8 @@ class Debugger # Auto continues the execution until the end or until an error is encountered var autocontinue = false + redef type FRAME: InterpreterFrame + ####################################################################### ## Execution of statement function ## ####################################################################### @@ -280,20 +282,13 @@ class Debugger assert args.length == mpropdef.msignature.arity + 1 else debug("Invalid arity for {mpropdef}. {args.length} arguments given.") # Look for the AST node that implements the property - var mproperty = mpropdef.mproperty - if self.modelbuilder.mpropdef2npropdef.has_key(mpropdef) then - var npropdef = self.modelbuilder.mpropdef2npropdef[mpropdef] - self.parameter_check(npropdef, mpropdef, args) - if npropdef isa AMethPropdef then - return npropdef.rt_call(self, mpropdef, args) - else - print "Error, invalid propdef to call at runtime !" - return null - end - else if mproperty.is_root_init then - var nclassdef = self.modelbuilder.mclassdef2nclassdef[mpropdef.mclassdef] - self.parameter_check(nclassdef, mpropdef, args) - return nclassdef.call(self, mpropdef, args) + var node = modelbuilder.mpropdef2node(mpropdef) + if node isa AMethPropdef then + self.parameter_check(node, mpropdef, args) + return node.rt_call(self, mpropdef, args) + else if node isa AClassdef then + self.parameter_check(node, mpropdef, args) + return node.call(self, mpropdef, args) else fatal("Fatal Error: method {mpropdef} not found in the AST") abort @@ -874,7 +869,7 @@ class Debugger # If the variable *variable_name* is an argument of the function being executed in the frame *frame* # The function returns its position in the arguments # Else, it returns -1 - private fun get_position_of_variable_in_arguments(frame: Frame, variable_name: String): Int + private fun get_position_of_variable_in_arguments(frame: FRAME, variable_name: String): Int do var identifiers = get_identifiers_in_current_instruction(get_function_arguments(frame.mpropdef.location.text)) for i in [0 .. identifiers.length-1] do @@ -1060,7 +1055,7 @@ class Debugger ####################################################################### # Seeks a variable from the current frame called 'variable_path', can introspect complex objects using function get_variable_in_mutable_instance - private fun seek_variable(variable_path: String, frame: Frame): nullable Instance + private fun seek_variable(variable_path: String, frame: FRAME): nullable Instance do var full_variable = variable_path.split_with(".") @@ -1080,7 +1075,7 @@ class Debugger end # Gets a variable 'variable_name' contained in the frame 'frame' - private fun get_variable_in_frame(variable_name: String, frame: Frame): nullable Instance + private fun get_variable_in_frame(variable_name: String, frame: FRAME): nullable Instance do if variable_name == "self" then if frame.arguments.length >= 1 then return frame.arguments.first @@ -1416,7 +1411,7 @@ redef class AMethPropdef # Not supposed to be used by anyone else than the Debugger. private fun rt_call(v: Debugger, mpropdef: MMethodDef, args: Array[Instance]): nullable Instance do - var f = new Frame(self, self.mpropdef.as(not null), args) + var f = new InterpreterFrame(self, self.mpropdef.as(not null), args) var curr_instances = v.frame.map for i in curr_instances.keys do f.map[i] = curr_instances[i]