elif qactual[0] == 'gosub': #print qactual[0], qactual[1] if current_scope != "*work*": memoria.sleepLocalMemory() memoria.addIP([ip, current_scope]) memoria.setLocalMemory() current_scope = qactual[1] direcmod = directory[qactual[1]][1] ip = direcmod - 2 elif qactual[0] == 'ret': memoria.freeLocalMemory() ipscope = memoria.getIP() if ipscope[1] != "*work*": memoria.awakeLocalMemory() ip = ipscope[0] current_scope = ipscope[1] elif qactual[0] == 'return': if int(qactual[1]) >= 40000: tmp = getDirData(getDirData(int(qactual[1]))) else: tmp = getDirData(int(qactual[1])) if int(qactual[3]) >= 40000: data = getDirData(int(qactual[3])) else: data = int(qactual[3]) addDirData(data, tmp) memoria.freeLocalMemory() ipscope = memoria.getIP()
num_parametros += 1 elif qactual[0] == 'gosub': #Operacion salto a modulo if current_scope != "*work*": memoria.sleepLocalMemory() #Si el ambito actual no es la memoria global, se duerme la memoria local en procedimiento. memoria.addIP([ip, current_scope]) #Se guarda el IP correspondiente a la invocacion para su proxima continuacion. memoria.setLocalMemory() #La memoria nueva se inicializa como nueva memoria local current_scope = qactual[1] #Se establece el nuevo scope a trabajar los cuadruplos direcmod = directory[qactual[1]][1] #Se obtiene el cuadruplo de inicio de modulo ip = direcmod - 2 elif qactual[0] == 'ret': #Operacion ret memoria.freeLocalMemory() #Libera la memoria local ipscope = memoria.getIP() #Obtiene el IP que realizo la ultima llamada if ipscope[1] != "*work*": memoria.awakeLocalMemory() #Si el scope es diferente al workspace, se manda llamar a un segmento previo de memoria local. ip = ipscope[0] current_scope = ipscope[1] #Se establece el nuevo scope actual. elif qactual[0] == 'return': #Operacion return if int(qactual[1]) >= 40000: tmp = getDirData(getDirData(int(qactual[1]))) #Obtiene el valor de la direccion del apuntador en referencia. else: tmp = getDirData(int(qactual[1])) #Obtiene el valor de la direccion dado por el cuadruplo. if int(qactual[3]) >= 40000: data = getDirData(int(qactual[3])) else: data = int(qactual[3]) addDirData(data, tmp) #Aniade el valor de retorno al espacio de memoria global memoria.freeLocalMemory() #Libera la memoria local ipscope = memoria.getIP() #Obtiene el IP que realizo la ultima llamada