xcbosa mbp16 2 ani în urmă
părinte
comite
ced93a6fd8

+ 146 - 0
XCTreeLang.xcodeproj/xcuserdata/xcbosa.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist

@@ -3,4 +3,150 @@
    uuid = "9DB8C21E-6765-4327-9039-80AB49D40492"
    type = "1"
    version = "2.0">
+   <Breakpoints>
+      <BreakpointProxy
+         BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
+         <BreakpointContent
+            uuid = "81C29057-447E-42BA-ACE5-94D46BE449CA"
+            shouldBeEnabled = "Yes"
+            ignoreCount = "0"
+            continueAfterRunningActions = "No"
+            filePath = "XCTreeLang/Statements/XCTLNextthanStatement.swift"
+            startingColumnNumber = "9223372036854775807"
+            endingColumnNumber = "9223372036854775807"
+            startingLineNumber = "37"
+            endingLineNumber = "37"
+            landmarkName = "evaluate(inContext:)"
+            landmarkType = "7">
+         </BreakpointContent>
+      </BreakpointProxy>
+      <BreakpointProxy
+         BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
+         <BreakpointContent
+            uuid = "ADCCEE0F-7CC6-4F7F-8F05-7FD7364EAEF6"
+            shouldBeEnabled = "Yes"
+            ignoreCount = "0"
+            continueAfterRunningActions = "No"
+            filePath = "XCTreeLang/Statements/XCTLNextthanStatement.swift"
+            startingColumnNumber = "9223372036854775807"
+            endingColumnNumber = "9223372036854775807"
+            startingLineNumber = "40"
+            endingLineNumber = "40"
+            landmarkName = "evaluate(inContext:)"
+            landmarkType = "7">
+         </BreakpointContent>
+      </BreakpointProxy>
+      <BreakpointProxy
+         BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
+         <BreakpointContent
+            uuid = "CE0B5C7A-BCB9-4114-8800-525E2AAC4483"
+            shouldBeEnabled = "Yes"
+            ignoreCount = "0"
+            continueAfterRunningActions = "No"
+            filePath = "XCTreeLang/Statements/XCTLEqualthanStatement.swift"
+            startingColumnNumber = "9223372036854775807"
+            endingColumnNumber = "9223372036854775807"
+            startingLineNumber = "43"
+            endingLineNumber = "43"
+            landmarkName = "evaluate(inContext:)"
+            landmarkType = "7">
+         </BreakpointContent>
+      </BreakpointProxy>
+      <BreakpointProxy
+         BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
+         <BreakpointContent
+            uuid = "D7417D2D-E757-4FA5-A8B8-DEA15E2D9450"
+            shouldBeEnabled = "Yes"
+            ignoreCount = "0"
+            continueAfterRunningActions = "No"
+            filePath = "XCTreeLang/Statements/XCTLEqualthanStatement.swift"
+            startingColumnNumber = "9223372036854775807"
+            endingColumnNumber = "9223372036854775807"
+            startingLineNumber = "48"
+            endingLineNumber = "48"
+            landmarkName = "evaluate(inContext:)"
+            landmarkType = "7">
+         </BreakpointContent>
+      </BreakpointProxy>
+      <BreakpointProxy
+         BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
+         <BreakpointContent
+            uuid = "F5980FF4-A83F-452C-905F-0FD18B485911"
+            shouldBeEnabled = "Yes"
+            ignoreCount = "0"
+            continueAfterRunningActions = "No"
+            filePath = "XCTreeLang/Statements/XCTLMorethanStatement.swift"
+            startingColumnNumber = "9223372036854775807"
+            endingColumnNumber = "9223372036854775807"
+            startingLineNumber = "47"
+            endingLineNumber = "47"
+            landmarkName = "evaluate(inContext:)"
+            landmarkType = "7">
+         </BreakpointContent>
+      </BreakpointProxy>
+      <BreakpointProxy
+         BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
+         <BreakpointContent
+            uuid = "034A1FDB-D45F-4C4B-AA1C-EA500BA70C63"
+            shouldBeEnabled = "Yes"
+            ignoreCount = "0"
+            continueAfterRunningActions = "No"
+            filePath = "XCTreeLang/Statements/XCTLMorethanStatement.swift"
+            startingColumnNumber = "9223372036854775807"
+            endingColumnNumber = "9223372036854775807"
+            startingLineNumber = "51"
+            endingLineNumber = "51"
+            landmarkName = "evaluate(inContext:)"
+            landmarkType = "7">
+         </BreakpointContent>
+      </BreakpointProxy>
+      <BreakpointProxy
+         BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
+         <BreakpointContent
+            uuid = "BB80C1F4-0108-45C0-B5F8-4D92615C620E"
+            shouldBeEnabled = "Yes"
+            ignoreCount = "0"
+            continueAfterRunningActions = "No"
+            filePath = "XCTreeLang/Statements/XCTLElseStatement.swift"
+            startingColumnNumber = "9223372036854775807"
+            endingColumnNumber = "9223372036854775807"
+            startingLineNumber = "41"
+            endingLineNumber = "41"
+            landmarkName = "evaluate(inContext:)"
+            landmarkType = "7">
+         </BreakpointContent>
+      </BreakpointProxy>
+      <BreakpointProxy
+         BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
+         <BreakpointContent
+            uuid = "2A529CD4-A110-4D23-B16C-CAFAFAD754ED"
+            shouldBeEnabled = "Yes"
+            ignoreCount = "0"
+            continueAfterRunningActions = "No"
+            filePath = "XCTreeLang/Statements/XCTLLessthanStatement.swift"
+            startingColumnNumber = "9223372036854775807"
+            endingColumnNumber = "9223372036854775807"
+            startingLineNumber = "47"
+            endingLineNumber = "47"
+            landmarkName = "evaluate(inContext:)"
+            landmarkType = "7">
+         </BreakpointContent>
+      </BreakpointProxy>
+      <BreakpointProxy
+         BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
+         <BreakpointContent
+            uuid = "38990361-989A-4D6E-A247-CA5959582158"
+            shouldBeEnabled = "Yes"
+            ignoreCount = "0"
+            continueAfterRunningActions = "No"
+            filePath = "XCTreeLang/Statements/XCTLLessthanStatement.swift"
+            startingColumnNumber = "9223372036854775807"
+            endingColumnNumber = "9223372036854775807"
+            startingLineNumber = "51"
+            endingLineNumber = "51"
+            landmarkName = "evaluate(inContext:)"
+            landmarkType = "7">
+         </BreakpointContent>
+      </BreakpointProxy>
+   </Breakpoints>
 </Bucket>

+ 1 - 0
XCTreeLang/Runtime/XCTLRuntimeAbstractContext.swift

@@ -15,6 +15,7 @@ internal protocol XCTLRuntimeAbstractContext: AnyObject {
     func value(forName name: String) -> XCTLRuntimeVariable?
     func setValue(_ value: XCTLRuntimeVariable, forName name: String)
     func setValueToRoot(_ value: XCTLRuntimeVariable, forName name: String)
+    func setValueIgnoreParent(_ value: XCTLRuntimeVariable, forName name: String)
     
     func addImport(name: String)
     func addExport(name: String)

+ 12 - 4
XCTreeLang/Runtime/XCTLRuntimeContext.swift

@@ -52,16 +52,20 @@ internal class XCTLRuntimeContext: XCTLRuntimeAbstractContext {
             fatalError($0.first?.stringValue ?? "fatalError from XCT")
         }), forName: "appFatalError")
         self.setValue(XCTLRuntimeVariable(funcImpl: {
-            for it in $0 {
+            for (id, it) in $0.enumerated() {
                 self.stdout.append(text: it.toString())
-                self.stdout.append(text: " ")
+                if id != $0.count - 1 {
+                    self.stdout.append(text: " ")
+                }
             }
             return .void
         }), forName: "log")
         self.setValue(XCTLRuntimeVariable(funcImpl: {
-            for it in $0 {
+            for (id, it) in $0.enumerated() {
                 self.stdout.append(text: it.toString())
-                self.stdout.append(text: " ")
+                if id != $0.count - 1 {
+                    self.stdout.append(text: " ")
+                }
             }
             self.stdout.append(text: "\n")
             return .void
@@ -159,6 +163,10 @@ internal class XCTLRuntimeContext: XCTLRuntimeAbstractContext {
         self.nativeObjectInstance.setValue(value.nativeValue, forKey: name)
     }
     
+    internal func setValueIgnoreParent(_ value: XCTLRuntimeVariable, forName name: String) {
+        self.setValue(value, forName: name)
+    }
+    
     internal func addImport(name: String) {
         self.importNames.insert(name)
     }

+ 6 - 2
XCTreeLang/Runtime/XCTLRuntimeSubContext.swift

@@ -68,6 +68,10 @@ internal class XCTLRuntimeSubContext: XCTLRuntimeAbstractContext {
         self.parent.setValueToRoot(value, forName: name)
     }
     
+    internal func setValueIgnoreParent(_ value: XCTLRuntimeVariable, forName name: String) {
+        self.values[name] = value
+    }
+    
     internal func addImport(name: String) {
         self.importNames.insert(name)
     }
@@ -93,14 +97,14 @@ internal class XCTLRuntimeSubContext: XCTLRuntimeAbstractContext {
     
     func findConditionFrame() -> XCTLConditionParentStatementFrame? {
         if let conditionFrame = self.conditionFrame {
-            return self.conditionFrame
+            return conditionFrame
         }
         return self.parent.findConditionFrame()
     }
     
     func findListFrame() -> XCTLListStatementFrame? {
         if let listFrame = self.listFrame {
-            return self.listFrame
+            return listFrame
         }
         return self.parent.findListFrame()
     }

+ 8 - 7
XCTreeLang/Statements/VirtualStatement/XCTLListStatement.swift

@@ -15,10 +15,6 @@ internal class XCTLListStatement: XCTLStatement, XCTLListStatementProtocol {
     
     var type: XCTLStatementType { .typeStatementList }
     
-    var breakListEvaluate: Bool = false
-    
-    var listResultValue: XCTLRuntimeVariable = .void
-    
     private var statements = [XCTLStatement]()
     
     internal weak var parent: XCTLStatement?
@@ -53,15 +49,20 @@ internal class XCTLListStatement: XCTLStatement, XCTLListStatementProtocol {
     }
     
     func evaluate(inContext context: XCTLRuntimeAbstractContext) throws -> XCTLRuntimeVariable {
+        let frame = XCTLListStatementFrame()
+        context.recordListFrame(frame)
         let context = context.makeSubContext()
         var lastValue = XCTLRuntimeVariable.void
         for it in statements {
-            lastValue = try it.evaluate(inContext: context)
-            if self.breakListEvaluate {
+            let newValue = try it.evaluate(inContext: context)
+            if newValue.type != .typeVoid {
+                lastValue = newValue
+            }
+            if frame.breakListEvaluate {
                 break
             }
         }
-        return listResultValue.type == .typeVoid ? lastValue : listResultValue
+        return frame.listResultValue.type == .typeVoid ? lastValue : frame.listResultValue
     }
     
 }

+ 4 - 1
XCTreeLang/Statements/XCTLElseStatement.swift

@@ -37,7 +37,10 @@ internal class XCTLElseStatement: XCTLStatement {
     }
     
     func evaluate(inContext context: XCTLRuntimeAbstractContext) throws -> XCTLRuntimeVariable {
-        if self.condStmt?.doElse ?? false {
+        guard let condFrame = context.findConditionFrame() else {
+            throw XCTLRuntimeError.invalidConditionFrame
+        }
+        if condFrame.doElse {
             return try self.listStmts.evaluate(inContext: context)
         }
         return .void

+ 8 - 4
XCTreeLang/Statements/XCTLEqualthanStatement.swift

@@ -39,14 +39,18 @@ internal class XCTLEqualthanStatement : XCTLStatement {
     }
     
     func evaluate(inContext context: XCTLRuntimeAbstractContext) throws -> XCTLRuntimeVariable {
+        guard let condFrame = context.findConditionFrame() else {
+            throw XCTLRuntimeError.invalidConditionFrame
+        }
+        
         guard let originalValue = self.parent?.holdingObject,
               originalValue.type != .typeVoid else {
             throw XCTLRuntimeError.parentNoHoldingObject
         }
         
-        if self.condStmt?.doNext ?? false {
-            self.condStmt?.doNext = false
-            self.condStmt?.doElse = false
+        if condFrame.doNext {
+            condFrame.doNext = false
+            condFrame.doElse = false
             return try self.childrenStmt.evaluate(inContext: context)
         }
         
@@ -62,7 +66,7 @@ internal class XCTLEqualthanStatement : XCTLStatement {
         }
         
         if equalTo {
-            self.condStmt?.doElse = false
+            condFrame.doElse = false
             return try self.childrenStmt.evaluate(inContext: context)
         }
         

+ 7 - 4
XCTreeLang/Statements/XCTLLessthanStatement.swift

@@ -43,13 +43,16 @@ internal class XCTLLessthanStatement : XCTLStatement {
     }
     
     func evaluate(inContext context: XCTLRuntimeAbstractContext) throws -> XCTLRuntimeVariable {
+        guard let condFrame = context.findConditionFrame() else {
+            throw XCTLRuntimeError.invalidConditionFrame
+        }
         guard let originalValue = self.parent?.holdingObject,
               originalValue.type != .typeVoid else {
             throw XCTLRuntimeError.parentNoHoldingObject
         }
-        if self.condStmt?.doNext ?? false {
-            self.condStmt?.doNext = false
-            self.condStmt?.doElse = false
+        if condFrame.doNext {
+            condFrame.doNext = false
+            condFrame.doElse = false
             return try self.childrenStmt.evaluate(inContext: context)
         }
         let compareValue = try self.compareValueStmt.evaluate(inContext: context)
@@ -60,7 +63,7 @@ internal class XCTLLessthanStatement : XCTLStatement {
             throw XCTLRuntimeError.unexpectedVariableType(expect: "number", butGot: compareValue.type.rawValue)
         }
         if compareValue.doubleValue > originalValue.doubleValue {
-            self.condStmt?.doElse = false
+            condFrame.doElse = false
             return try self.childrenStmt.evaluate(inContext: context)
         }
         return .void

+ 7 - 4
XCTreeLang/Statements/XCTLMorethanStatement.swift

@@ -43,13 +43,16 @@ internal class XCTLMorethanStatement : XCTLStatement {
     }
     
     func evaluate(inContext context: XCTLRuntimeAbstractContext) throws -> XCTLRuntimeVariable {
+        guard let condFrame = context.findConditionFrame() else {
+            throw XCTLRuntimeError.invalidConditionFrame
+        }
         guard let originalValue = self.parent?.holdingObject,
               originalValue.type != .typeVoid else {
             throw XCTLRuntimeError.parentNoHoldingObject
         }
-        if self.condStmt?.doNext ?? false {
-            self.condStmt?.doNext = false
-            self.condStmt?.doElse = false
+        if condFrame.doNext {
+            condFrame.doNext = false
+            condFrame.doElse = false
             return try self.childrenStmt.evaluate(inContext: context)
         }
         let compareValue = try self.compareValueStmt.evaluate(inContext: context)
@@ -60,7 +63,7 @@ internal class XCTLMorethanStatement : XCTLStatement {
             throw XCTLRuntimeError.unexpectedVariableType(expect: "number", butGot: compareValue.type.rawValue)
         }
         if compareValue.doubleValue < originalValue.doubleValue {
-            self.condStmt?.doElse = false
+            condFrame.doElse = false
             return try self.childrenStmt.evaluate(inContext: context)
         }
         return .void

+ 8 - 2
XCTreeLang/Statements/XCTLNextthanStatement.swift

@@ -33,8 +33,14 @@ internal class XCTLNextthanStatement: XCTLStatement {
     }
     
     func evaluate(inContext context: XCTLRuntimeAbstractContext) throws -> XCTLRuntimeVariable {
-        (parent as? XCTLListStatementProtocol)?.breakListEvaluate = true
-        parentCond?.doNext = true
+        guard let listFrame = context.findListFrame() else {
+            throw XCTLRuntimeError.invalidListFrame
+        }
+        guard let condFrame = context.findConditionFrame() else {
+            throw XCTLRuntimeError.invalidConditionFrame
+        }
+        listFrame.breakListEvaluate = true
+        condFrame.doNext = true
         return .void
     }
     

+ 1 - 1
XCTreeLang/Statements/XCTLParagraphStatement.swift

@@ -65,7 +65,7 @@ internal class XCTLParagraphStatement: XCTLStatement, XCTLLateExecuteStatement {
             if argId >= args.count {
                 throw XCTLRuntimeError.paragraphArgsNotEnough(needCount: self.argumentIdList.count, butGot: args.count)
             }
-            subContext.setValue(args[argId], forName: argumentId)
+            subContext.setValueIgnoreParent(args[argId], forName: argumentId)
             argId += 1
         }
         return try self.runStatements.evaluate(inContext: subContext)

+ 7 - 3
XCTreeLang/Statements/XCTLReturnStatement.swift

@@ -45,10 +45,14 @@ internal class XCTLReturnStatement: XCTLStatement {
     }
     
     func evaluate(inContext context: XCTLRuntimeAbstractContext) throws -> XCTLRuntimeVariable {
+        guard let listFrame = context.findListFrame() else {
+            throw XCTLRuntimeError.invalidListFrame
+        }
+        let condFrame = context.findConditionFrame()
         let value = try self.returnValueStatement.evaluate(inContext: context)
-        self.parentParagraph.runStatements.breakListEvaluate = true
-        self.parentParagraph.runStatements.listResultValue = value
-        self.parentParagraph.runStatements.conditionParent?.doElse = false
+        listFrame.breakListEvaluate = true
+        listFrame.listResultValue = value
+        condFrame?.doElse = false
         return value
     }
     

+ 7 - 7
XCTreeLang/Statements/XCTLStatement.swift

@@ -29,19 +29,19 @@ internal protocol XCTLStatement: AnyObject {
 
 internal protocol XCTLListStatementProtocol: AnyObject {
     
-    var breakListEvaluate: Bool { get set }
-    
-    var listResultValue: XCTLRuntimeVariable { get set }
-    
+//    var breakListEvaluate: Bool { get set }
+//
+//    var listResultValue: XCTLRuntimeVariable { get set }
+//
     var conditionParent: XCTLConditionParentStatement? { get }
     
 }
 
 internal protocol XCTLConditionParentStatement: AnyObject {
     
-    var doElse: Bool { get set }
-    
-    var doNext: Bool { get set }
+//    var doElse: Bool { get set }
+//    
+//    var doNext: Bool { get set }
     
 }
 

+ 2 - 0
XCTreeLang/Statements/XCTLSwitchStatement.swift

@@ -37,6 +37,8 @@ internal class XCTLSwitchStatement: XCTLStatement, XCTLConditionParentStatement
     }
     
     func evaluate(inContext context: XCTLRuntimeAbstractContext) throws -> XCTLRuntimeVariable {
+        let condFrame = XCTLConditionParentStatementFrame()
+        context.recordConditionFrame(condFrame)
         self.holdingObject = try self.switchingObjectStmt.evaluate(inContext: context)
         if self.holdingObject.type == .typeVoid {
             throw XCTLRuntimeError.unexpectedVariableType(expect: "any", butGot: "void")

+ 3 - 0
XCTreeLang/XCTLRuntimeError.swift

@@ -21,5 +21,8 @@ public enum XCTLRuntimeError: Error {
     
     case paragraphArgsNotEnough(needCount: Int, butGot: Int)
     
+    case invalidConditionFrame
+    case invalidListFrame
+    
 }