Преглед на файлове

Support interop with oc native types

xcbosa mbp16 преди 2 години
родител
ревизия
ddd8cae6bd

+ 38 - 16
Interop/Invocation.swift

@@ -1,6 +1,7 @@
 //
 //
 //  Dynamic
 //  Dynamic
 //  Created by Mhd Hejazi on 4/15/20.
 //  Created by Mhd Hejazi on 4/15/20.
+//  Modify by XCBOSA on 6/3/23
 //  Copyright © 2020 Samabox. All rights reserved.
 //  Copyright © 2020 Samabox. All rights reserved.
 //
 //
 
 
@@ -14,6 +15,7 @@ class Invocation {
 
 
     var invocation: NSObject?
     var invocation: NSObject?
 
 
+    var typeEncoding: String?
     var numberOfArguments: Int = 0
     var numberOfArguments: Int = 0
     var returnLength: Int = 0
     var returnLength: Int = 0
     var returnType: UnsafePointer<CChar>?
     var returnType: UnsafePointer<CChar>?
@@ -101,32 +103,52 @@ class Invocation {
             method(invocation, selector)
             method(invocation, selector)
         }
         }
     }
     }
+    
+    private func getArgumentType(at index: NSInteger) -> String? {
+        guard let invocation = invocation else { return nil }
+        
+        let methodSignatureSelector = NSSelectorFromString("methodSignature")
+        let methodSignatureSignature = (@convention(c)(NSObject, Selector) -> NSObject).self
+        let methodSignatureMethod = unsafeBitCast(invocation.method(for: methodSignatureSelector), to: methodSignatureSignature)
+        
+        let methodSignature = methodSignatureMethod(invocation, methodSignatureSelector)
+        
+        let selector = NSSelectorFromString("getArgumentTypeAtIndex:")
+        let signature = (@convention(c)(NSObject, Selector, NSInteger) -> UnsafePointer<CChar>).self
+        let method = unsafeBitCast(methodSignature.method(for: selector), to: signature)
+        
+        let rawType = method(methodSignature, selector, index)
+        return NSString(cString: rawType, encoding: NSUTF8StringEncoding) as? String
+    }
 
 
     func setArgument(_ argument: Any?, at index: NSInteger) {
     func setArgument(_ argument: Any?, at index: NSInteger) {
         guard let invocation = invocation else { return }
         guard let invocation = invocation else { return }
+        
+        let argument = TypeMapping.convertToObjCType(argument) ?? argument
+        guard let realArgumentType = self.getArgumentType(at: index) else { return }
 
 
         /// `[invocation setArgument:&argument atIndex:i + 2]`
         /// `[invocation setArgument:&argument atIndex:i + 2]`
         let selector = NSSelectorFromString("setArgument:atIndex:")
         let selector = NSSelectorFromString("setArgument:atIndex:")
         let signature = (@convention(c)(NSObject, Selector, UnsafeRawPointer, Int) -> Void).self
         let signature = (@convention(c)(NSObject, Selector, UnsafeRawPointer, Int) -> Void).self
         let method = unsafeBitCast(invocation.method(for: selector), to: signature)
         let method = unsafeBitCast(invocation.method(for: selector), to: signature)
-
-        if var valueArgument = argument as? NSValue {
-            /// Get the type byte size
-//            valueArgument = NSNumber(floatLiteral: argument as! Double)
-            let typeSize = UnsafeMutablePointer<Int>.allocate(capacity: 1)
-            defer { typeSize.deallocate() }
-            NSGetSizeAndAlignment(valueArgument.objCType, typeSize, nil)
-
-            /// Get the actual value
-            let buffer = UnsafeMutablePointer<Int8>.allocate(capacity: typeSize.pointee)
-            defer { buffer.deallocate() }
-            valueArgument.getValue(buffer)
-
-            method(invocation, selector, buffer, index)
-        } else {
+        
+//        if let valueArgument = argument as? NSNumber {
+//            /// Get the type byte size
+////            valueArgument = NSNumber(floatLiteral: argument as! Double)
+//            let typeSize = UnsafeMutablePointer<Int>.allocate(capacity: 1)
+//            defer { typeSize.deallocate() }
+//            NSGetSizeAndAlignment(valueArgument.objCType, typeSize, nil)
+//
+//            /// Get the actual value
+//            let buffer = UnsafeMutablePointer<Int8>.allocate(capacity: typeSize.pointee)
+//            defer { buffer.deallocate() }
+//            valueArgument.getValue(buffer)
+//
+//            method(invocation, selector, buffer, index)
+//        } else {
             withUnsafePointer(to: argument) { pointer in
             withUnsafePointer(to: argument) { pointer in
                 method(invocation, selector, pointer, index)
                 method(invocation, selector, pointer, index)
-            }
+//            }
         }
         }
     }
     }
 
 

+ 2 - 0
Interop/TypeMapping.swift

@@ -86,6 +86,8 @@ class TypeMapping {
         case is URLQueryItem: return object as? NSURLQueryItem
         case is URLQueryItem: return object as? NSURLQueryItem
         case is URLRequest: return object as? NSURLRequest
         case is URLRequest: return object as? NSURLRequest
         case is UUID: return object as? NSUUID
         case is UUID: return object as? NSUUID
+        case is Double: return object as? NSNumber
+        case is Bool: return object as? NSValue
         default: return nil
         default: return nil
         }
         }
     }
     }

+ 153 - 0
Interop/XCTLSwiftInvocation.swift

@@ -0,0 +1,153 @@
+//
+//  XCTLSwiftInvocation.swift
+//  XCTreeLang
+//
+//  Created by 邢铖 on 2023/6/3.
+//
+
+import Foundation
+import XCTLRuntimeTypeInstanceModule
+
+public class XCTLSwiftInvocation {
+    
+    private let invocation: XCTLInvocation
+    
+    public init(target: NSObject, selector: Selector) {
+        self.invocation = XCTLInvocation(object: target, for: selector)
+    }
+    
+    public func invokeMemberFunc(params: [Any?]) throws -> Any {
+        var id = 2
+        if self.invocation.numberOfArguments() != params.count + 2 {
+            throw XCTLRuntimeError.paragraphArgsNotEnough(needCount: self.invocation.numberOfArguments() - 2, butGot: params.count)
+        }
+        for it in params {
+            let type = self.invocation.typeEncodingForArgument(at: id)
+            switch type {
+            case "c":
+                guard let ch = (it as? String)?.utf8.first else {
+                    throw XCTLRuntimeError.callingTypeEncodingError
+                }
+                self.invocation.setArgument_c(CChar(ch), at: id)
+                break
+            case "s":
+                guard let double = it as? Double else {
+                    throw XCTLRuntimeError.callingTypeEncodingError
+                }
+                self.invocation.setArgument_s(Int16(double), at: id)
+                break
+            case "i":
+                guard let double = it as? Double else {
+                    throw XCTLRuntimeError.callingTypeEncodingError
+                }
+                self.invocation.setArgument_i(Int32(double), at: id)
+                break
+            case "q":
+                guard let double = it as? Double else {
+                    throw XCTLRuntimeError.callingTypeEncodingError
+                }
+                self.invocation.setArgument_q(Int64(double), at: id)
+                break
+            case "C":
+                guard let ch = (it as? String)?.utf8.first else {
+                    throw XCTLRuntimeError.callingTypeEncodingError
+                }
+                self.invocation.setArgument_C(UInt8(ch), at: id)
+                break
+            case "S":
+                guard let double = it as? Double else {
+                    throw XCTLRuntimeError.callingTypeEncodingError
+                }
+                self.invocation.setArgument_S(UInt16(double), at: id)
+                break
+            case "I":
+                guard let double = it as? Double else {
+                    throw XCTLRuntimeError.callingTypeEncodingError
+                }
+                self.invocation.setArgument_I(UInt32(double), at: id)
+                break
+            case "Q":
+                guard let double = it as? Double else {
+                    throw XCTLRuntimeError.callingTypeEncodingError
+                }
+                self.invocation.setArgument_Q(UInt64(double), at: id)
+                break
+            case "L":
+                guard let double = it as? Double else {
+                    throw XCTLRuntimeError.callingTypeEncodingError
+                }
+                self.invocation.setArgument_L(UInt(double), at: id)
+                break
+            case "f":
+                guard let double = it as? Double else {
+                    throw XCTLRuntimeError.callingTypeEncodingError
+                }
+                self.invocation.setArgument_f(Float(double), at: id)
+                break
+            case "d":
+                guard let double = it as? Double else {
+                    throw XCTLRuntimeError.callingTypeEncodingError
+                }
+                self.invocation.setArgument_d(double, at: id)
+                break
+            case "B":
+                guard let bool = it as? Bool else {
+                    throw XCTLRuntimeError.callingTypeEncodingError
+                }
+                self.invocation.setArgument_B(bool, at: id)
+                break
+            case "*":
+                guard let string = it as? String else {
+                    throw XCTLRuntimeError.callingTypeEncodingError
+                }
+                self.invocation.setArgument_star(string, at: id)
+                break
+            case "@":
+                guard let object = it as? NSObject else {
+                    throw XCTLRuntimeError.callingTypeEncodingError
+                }
+                self.invocation.setArgument_at(object, at: id)
+                break
+            default:
+                throw XCTLRuntimeError.unknownTypeEncoding(name: type)
+            }
+            id += 1
+        }
+        self.invocation.invoke()
+        switch self.invocation.methodReturnType() {
+        case "v":
+            return NSNull()
+        case "c":
+            return self.invocation.getReturnValue_c()
+        case "s":
+            return self.invocation.getReturnValue_s()
+        case "i":
+            return self.invocation.getReturnValue_i()
+        case "q":
+            return self.invocation.getReturnValue_q()
+        case "C":
+            return self.invocation.getReturnValue_C()
+        case "S":
+            return self.invocation.getReturnValue_S()
+        case "I":
+            return self.invocation.getReturnValue_I()
+        case "Q":
+            return self.invocation.getReturnValue_Q()
+        case "L":
+            return self.invocation.getReturnValue_L()
+        case "f":
+            return self.invocation.getReturnValue_F()
+        case "d":
+            return self.invocation.getReturnValue_D()
+        case "B":
+            return self.invocation.getReturnValue_B()
+        case "*":
+            return self.invocation.getReturnValue_star()
+        case "@":
+            return self.invocation.getReturnValue_at()
+        default:
+            throw XCTLRuntimeError.unknownTypeEncoding(name: self.invocation.methodReturnType())
+        }
+    }
+    
+}

+ 24 - 0
XCTreeLang.xcodeproj/project.pbxproj

@@ -63,6 +63,10 @@
 		756916AC2A29A357005FF14B /* XCTLExpression.swift in Sources */ = {isa = PBXBuildFile; fileRef = 756916AB2A29A357005FF14B /* XCTLExpression.swift */; };
 		756916AC2A29A357005FF14B /* XCTLExpression.swift in Sources */ = {isa = PBXBuildFile; fileRef = 756916AB2A29A357005FF14B /* XCTLExpression.swift */; };
 		756916AF2A29CD2C005FF14B /* Invocation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 756916AE2A29CD2C005FF14B /* Invocation.swift */; };
 		756916AF2A29CD2C005FF14B /* Invocation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 756916AE2A29CD2C005FF14B /* Invocation.swift */; };
 		756916B12A29D74E005FF14B /* TypeMapping.swift in Sources */ = {isa = PBXBuildFile; fileRef = 756916B02A29D74E005FF14B /* TypeMapping.swift */; };
 		756916B12A29D74E005FF14B /* TypeMapping.swift in Sources */ = {isa = PBXBuildFile; fileRef = 756916B02A29D74E005FF14B /* TypeMapping.swift */; };
+		756916B42A2B7D20005FF14B /* XCTLInvocation.h in Headers */ = {isa = PBXBuildFile; fileRef = 756916B22A2B7D20005FF14B /* XCTLInvocation.h */; };
+		756916B52A2B7D20005FF14B /* XCTLInvocation.m in Sources */ = {isa = PBXBuildFile; fileRef = 756916B32A2B7D20005FF14B /* XCTLInvocation.m */; };
+		756916B92A2B86AA005FF14B /* XCTLSwiftInvocation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 756916B82A2B86AA005FF14B /* XCTLSwiftInvocation.swift */; };
+		756916BD2A2B91E7005FF14B /* NSArray+Enumerator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 756916BC2A2B91E7005FF14B /* NSArray+Enumerator.swift */; };
 /* End PBXBuildFile section */
 /* End PBXBuildFile section */
 
 
 /* Begin PBXContainerItemProxy section */
 /* Begin PBXContainerItemProxy section */
@@ -150,6 +154,10 @@
 		756916AB2A29A357005FF14B /* XCTLExpression.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = XCTLExpression.swift; sourceTree = "<group>"; };
 		756916AB2A29A357005FF14B /* XCTLExpression.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = XCTLExpression.swift; sourceTree = "<group>"; };
 		756916AE2A29CD2C005FF14B /* Invocation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Invocation.swift; sourceTree = "<group>"; };
 		756916AE2A29CD2C005FF14B /* Invocation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Invocation.swift; sourceTree = "<group>"; };
 		756916B02A29D74E005FF14B /* TypeMapping.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TypeMapping.swift; sourceTree = "<group>"; };
 		756916B02A29D74E005FF14B /* TypeMapping.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TypeMapping.swift; sourceTree = "<group>"; };
+		756916B22A2B7D20005FF14B /* XCTLInvocation.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = XCTLInvocation.h; sourceTree = "<group>"; };
+		756916B32A2B7D20005FF14B /* XCTLInvocation.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = XCTLInvocation.m; sourceTree = "<group>"; };
+		756916B82A2B86AA005FF14B /* XCTLSwiftInvocation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = XCTLSwiftInvocation.swift; sourceTree = "<group>"; };
+		756916BC2A2B91E7005FF14B /* NSArray+Enumerator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NSArray+Enumerator.swift"; sourceTree = "<group>"; };
 /* End PBXFileReference section */
 /* End PBXFileReference section */
 
 
 /* Begin PBXFrameworksBuildPhase section */
 /* Begin PBXFrameworksBuildPhase section */
@@ -309,6 +317,7 @@
 			children = (
 			children = (
 				756916902A28C46D005FF14B /* XCTLEnumerator.swift */,
 				756916902A28C46D005FF14B /* XCTLEnumerator.swift */,
 				756916922A28C4B6005FF14B /* XCTLRange.swift */,
 				756916922A28C4B6005FF14B /* XCTLRange.swift */,
+				756916BB2A2B91DD005FF14B /* Extension */,
 			);
 			);
 			path = NativeTypes;
 			path = NativeTypes;
 			sourceTree = "<group>";
 			sourceTree = "<group>";
@@ -327,6 +336,8 @@
 			children = (
 			children = (
 				7569169F2A28FE20005FF14B /* XCTLRuntimeTypeInstance.h */,
 				7569169F2A28FE20005FF14B /* XCTLRuntimeTypeInstance.h */,
 				756916A02A28FE20005FF14B /* XCTLRuntimeTypeInstance.m */,
 				756916A02A28FE20005FF14B /* XCTLRuntimeTypeInstance.m */,
+				756916B22A2B7D20005FF14B /* XCTLInvocation.h */,
+				756916B32A2B7D20005FF14B /* XCTLInvocation.m */,
 				756916A42A28FF05005FF14B /* module.modulemap */,
 				756916A42A28FF05005FF14B /* module.modulemap */,
 			);
 			);
 			path = Instance;
 			path = Instance;
@@ -337,10 +348,19 @@
 			children = (
 			children = (
 				756916AE2A29CD2C005FF14B /* Invocation.swift */,
 				756916AE2A29CD2C005FF14B /* Invocation.swift */,
 				756916B02A29D74E005FF14B /* TypeMapping.swift */,
 				756916B02A29D74E005FF14B /* TypeMapping.swift */,
+				756916B82A2B86AA005FF14B /* XCTLSwiftInvocation.swift */,
 			);
 			);
 			path = Interop;
 			path = Interop;
 			sourceTree = "<group>";
 			sourceTree = "<group>";
 		};
 		};
+		756916BB2A2B91DD005FF14B /* Extension */ = {
+			isa = PBXGroup;
+			children = (
+				756916BC2A2B91E7005FF14B /* NSArray+Enumerator.swift */,
+			);
+			path = Extension;
+			sourceTree = "<group>";
+		};
 /* End PBXGroup section */
 /* End PBXGroup section */
 
 
 /* Begin PBXHeadersBuildPhase section */
 /* Begin PBXHeadersBuildPhase section */
@@ -349,6 +369,7 @@
 			buildActionMask = 2147483647;
 			buildActionMask = 2147483647;
 			files = (
 			files = (
 				7520C3E92A283AFC0010E7F8 /* XCTreeLang.h in Headers */,
 				7520C3E92A283AFC0010E7F8 /* XCTreeLang.h in Headers */,
+				756916B42A2B7D20005FF14B /* XCTLInvocation.h in Headers */,
 				756916A12A28FE20005FF14B /* XCTLRuntimeTypeInstance.h in Headers */,
 				756916A12A28FE20005FF14B /* XCTLRuntimeTypeInstance.h in Headers */,
 			);
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 			runOnlyForDeploymentPostprocessing = 0;
@@ -478,15 +499,18 @@
 				7520C42D2A283B1E0010E7F8 /* XCTLListStatement.swift in Sources */,
 				7520C42D2A283B1E0010E7F8 /* XCTLListStatement.swift in Sources */,
 				7520C4222A283B1E0010E7F8 /* XCTLInitStatement.swift in Sources */,
 				7520C4222A283B1E0010E7F8 /* XCTLInitStatement.swift in Sources */,
 				756916872A2851DF005FF14B /* XCTLStream.swift in Sources */,
 				756916872A2851DF005FF14B /* XCTLStream.swift in Sources */,
+				756916B92A2B86AA005FF14B /* XCTLSwiftInvocation.swift in Sources */,
 				756916A22A28FE20005FF14B /* XCTLRuntimeTypeInstance.m in Sources */,
 				756916A22A28FE20005FF14B /* XCTLRuntimeTypeInstance.m in Sources */,
 				756916B12A29D74E005FF14B /* TypeMapping.swift in Sources */,
 				756916B12A29D74E005FF14B /* TypeMapping.swift in Sources */,
 				7520C41E2A283B1E0010E7F8 /* XCTLImmediateStatement.swift in Sources */,
 				7520C41E2A283B1E0010E7F8 /* XCTLImmediateStatement.swift in Sources */,
 				756916892A286A90005FF14B /* XCTLSetStatement.swift in Sources */,
 				756916892A286A90005FF14B /* XCTLSetStatement.swift in Sources */,
 				756916972A28DFE7005FF14B /* XCTLBreakStatement.swift in Sources */,
 				756916972A28DFE7005FF14B /* XCTLBreakStatement.swift in Sources */,
+				756916BD2A2B91E7005FF14B /* NSArray+Enumerator.swift in Sources */,
 				7520C4312A283B1E0010E7F8 /* XCTLRuntimeVariable.swift in Sources */,
 				7520C4312A283B1E0010E7F8 /* XCTLRuntimeVariable.swift in Sources */,
 				756916912A28C46D005FF14B /* XCTLEnumerator.swift in Sources */,
 				756916912A28C46D005FF14B /* XCTLEnumerator.swift in Sources */,
 				756916AC2A29A357005FF14B /* XCTLExpression.swift in Sources */,
 				756916AC2A29A357005FF14B /* XCTLExpression.swift in Sources */,
 				7520C42C2A283B1E0010E7F8 /* XCTLLessthanStatement.swift in Sources */,
 				7520C42C2A283B1E0010E7F8 /* XCTLLessthanStatement.swift in Sources */,
+				756916B52A2B7D20005FF14B /* XCTLInvocation.m in Sources */,
 				7520C4332A283B1E0010E7F8 /* XCTLRuntimeVariableType.swift in Sources */,
 				7520C4332A283B1E0010E7F8 /* XCTLRuntimeVariableType.swift in Sources */,
 				7520C4202A283B1E0010E7F8 /* XCTLRootStatement.swift in Sources */,
 				7520C4202A283B1E0010E7F8 /* XCTLRootStatement.swift in Sources */,
 				756916932A28C4B6005FF14B /* XCTLRange.swift in Sources */,
 				756916932A28C4B6005FF14B /* XCTLRange.swift in Sources */,

+ 439 - 44
XCTreeLang.xcodeproj/xcuserdata/xcbosa.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist

@@ -49,6 +49,21 @@
                   endingLineNumber = "45"
                   endingLineNumber = "45"
                   offsetFromSymbolStart = "1980">
                   offsetFromSymbolStart = "1980">
                </Location>
                </Location>
+               <Location
+                  uuid = "CE0B5C7A-BCB9-4114-8800-525E2AAC4483 - c4f83559009bff5e"
+                  shouldBeEnabled = "Yes"
+                  ignoreCount = "0"
+                  continueAfterRunningActions = "No"
+                  symbolName = "XCTreeLang.XCTLEqualthanStatement.evaluate(inContext: XCTreeLang.XCTLRuntimeAbstractContext) throws -&gt; XCTreeLang.XCTLRuntimeVariable"
+                  moduleName = "XCTreeLang"
+                  usesParentBreakpointCondition = "Yes"
+                  urlString = "file:///Users/xcbosa/Documents/LibraryProjects/XCTreeLang/XCTreeLang/Statements/XCTLEqualthanStatement.swift"
+                  startingColumnNumber = "9223372036854775807"
+                  endingColumnNumber = "9223372036854775807"
+                  startingLineNumber = "45"
+                  endingLineNumber = "45"
+                  offsetFromSymbolStart = "2040">
+               </Location>
             </Locations>
             </Locations>
          </BreakpointContent>
          </BreakpointContent>
       </BreakpointProxy>
       </BreakpointProxy>
@@ -97,6 +112,21 @@
                   endingLineNumber = "50"
                   endingLineNumber = "50"
                   offsetFromSymbolStart = "1892">
                   offsetFromSymbolStart = "1892">
                </Location>
                </Location>
+               <Location
+                  uuid = "D7417D2D-E757-4FA5-A8B8-DEA15E2D9450 - c4f83559009bffb5"
+                  shouldBeEnabled = "Yes"
+                  ignoreCount = "0"
+                  continueAfterRunningActions = "No"
+                  symbolName = "XCTreeLang.XCTLEqualthanStatement.evaluate(inContext: XCTreeLang.XCTLRuntimeAbstractContext) throws -&gt; XCTreeLang.XCTLRuntimeVariable"
+                  moduleName = "XCTreeLang"
+                  usesParentBreakpointCondition = "Yes"
+                  urlString = "file:///Users/xcbosa/Documents/LibraryProjects/XCTreeLang/XCTreeLang/Statements/XCTLEqualthanStatement.swift"
+                  startingColumnNumber = "9223372036854775807"
+                  endingColumnNumber = "9223372036854775807"
+                  startingLineNumber = "50"
+                  endingLineNumber = "50"
+                  offsetFromSymbolStart = "1952">
+               </Location>
             </Locations>
             </Locations>
          </BreakpointContent>
          </BreakpointContent>
       </BreakpointProxy>
       </BreakpointProxy>
@@ -193,6 +223,21 @@
                   endingLineNumber = "49"
                   endingLineNumber = "49"
                   offsetFromSymbolStart = "2036">
                   offsetFromSymbolStart = "2036">
                </Location>
                </Location>
+               <Location
+                  uuid = "2A529CD4-A110-4D23-B16C-CAFAFAD754ED - 22f22d847ab15e90"
+                  shouldBeEnabled = "Yes"
+                  ignoreCount = "0"
+                  continueAfterRunningActions = "No"
+                  symbolName = "XCTreeLang.XCTLLessthanStatement.evaluate(inContext: XCTreeLang.XCTLRuntimeAbstractContext) throws -&gt; XCTreeLang.XCTLRuntimeVariable"
+                  moduleName = "XCTreeLang"
+                  usesParentBreakpointCondition = "Yes"
+                  urlString = "file:///Users/xcbosa/Documents/LibraryProjects/XCTreeLang/XCTreeLang/Statements/XCTLLessthanStatement.swift"
+                  startingColumnNumber = "9223372036854775807"
+                  endingColumnNumber = "9223372036854775807"
+                  startingLineNumber = "49"
+                  endingLineNumber = "49"
+                  offsetFromSymbolStart = "2132">
+               </Location>
             </Locations>
             </Locations>
          </BreakpointContent>
          </BreakpointContent>
       </BreakpointProxy>
       </BreakpointProxy>
@@ -241,6 +286,21 @@
                   endingLineNumber = "53"
                   endingLineNumber = "53"
                   offsetFromSymbolStart = "1948">
                   offsetFromSymbolStart = "1948">
                </Location>
                </Location>
+               <Location
+                  uuid = "38990361-989A-4D6E-A247-CA5959582158 - 22f22d847ab15e14"
+                  shouldBeEnabled = "Yes"
+                  ignoreCount = "0"
+                  continueAfterRunningActions = "No"
+                  symbolName = "XCTreeLang.XCTLLessthanStatement.evaluate(inContext: XCTreeLang.XCTLRuntimeAbstractContext) throws -&gt; XCTreeLang.XCTLRuntimeVariable"
+                  moduleName = "XCTreeLang"
+                  usesParentBreakpointCondition = "Yes"
+                  urlString = "file:///Users/xcbosa/Documents/LibraryProjects/XCTreeLang/XCTreeLang/Statements/XCTLLessthanStatement.swift"
+                  startingColumnNumber = "9223372036854775807"
+                  endingColumnNumber = "9223372036854775807"
+                  startingLineNumber = "53"
+                  endingLineNumber = "53"
+                  offsetFromSymbolStart = "2044">
+               </Location>
             </Locations>
             </Locations>
          </BreakpointContent>
          </BreakpointContent>
       </BreakpointProxy>
       </BreakpointProxy>
@@ -433,6 +493,21 @@
                   endingLineNumber = "61"
                   endingLineNumber = "61"
                   offsetFromSymbolStart = "1084">
                   offsetFromSymbolStart = "1084">
                </Location>
                </Location>
+               <Location
+                  uuid = "1157454B-7DC1-435C-810F-6DAF5F2B563C - c4f83559009bf12e"
+                  shouldBeEnabled = "Yes"
+                  ignoreCount = "0"
+                  continueAfterRunningActions = "No"
+                  symbolName = "XCTreeLang.XCTLEqualthanStatement.evaluate(inContext: XCTreeLang.XCTLRuntimeAbstractContext) throws -&gt; XCTreeLang.XCTLRuntimeVariable"
+                  moduleName = "XCTreeLang"
+                  usesParentBreakpointCondition = "Yes"
+                  urlString = "file:///Users/xcbosa/Documents/LibraryProjects/XCTreeLang/XCTreeLang/Statements/XCTLEqualthanStatement.swift"
+                  startingColumnNumber = "9223372036854775807"
+                  endingColumnNumber = "9223372036854775807"
+                  startingLineNumber = "61"
+                  endingLineNumber = "61"
+                  offsetFromSymbolStart = "1120">
+               </Location>
             </Locations>
             </Locations>
          </BreakpointContent>
          </BreakpointContent>
       </BreakpointProxy>
       </BreakpointProxy>
@@ -481,6 +556,21 @@
                   endingLineNumber = "49"
                   endingLineNumber = "49"
                   offsetFromSymbolStart = "2040">
                   offsetFromSymbolStart = "2040">
                </Location>
                </Location>
+               <Location
+                  uuid = "B991C77B-91F4-4A57-AC7E-D5C29D505801 - e06e50c0e5a63668"
+                  shouldBeEnabled = "Yes"
+                  ignoreCount = "0"
+                  continueAfterRunningActions = "No"
+                  symbolName = "XCTreeLang.XCTLMorethanStatement.evaluate(inContext: XCTreeLang.XCTLRuntimeAbstractContext) throws -&gt; XCTreeLang.XCTLRuntimeVariable"
+                  moduleName = "XCTreeLang"
+                  usesParentBreakpointCondition = "Yes"
+                  urlString = "file:///Users/xcbosa/Documents/LibraryProjects/XCTreeLang/XCTreeLang/Statements/XCTLMorethanStatement.swift"
+                  startingColumnNumber = "9223372036854775807"
+                  endingColumnNumber = "9223372036854775807"
+                  startingLineNumber = "49"
+                  endingLineNumber = "49"
+                  offsetFromSymbolStart = "2136">
+               </Location>
             </Locations>
             </Locations>
          </BreakpointContent>
          </BreakpointContent>
       </BreakpointProxy>
       </BreakpointProxy>
@@ -529,6 +619,21 @@
                   endingLineNumber = "53"
                   endingLineNumber = "53"
                   offsetFromSymbolStart = "1952">
                   offsetFromSymbolStart = "1952">
                </Location>
                </Location>
+               <Location
+                  uuid = "DE99138A-2D5F-4CC4-A11F-FAD9B843566D - e06e50c0e5a636d4"
+                  shouldBeEnabled = "Yes"
+                  ignoreCount = "0"
+                  continueAfterRunningActions = "No"
+                  symbolName = "XCTreeLang.XCTLMorethanStatement.evaluate(inContext: XCTreeLang.XCTLRuntimeAbstractContext) throws -&gt; XCTreeLang.XCTLRuntimeVariable"
+                  moduleName = "XCTreeLang"
+                  usesParentBreakpointCondition = "Yes"
+                  urlString = "file:///Users/xcbosa/Documents/LibraryProjects/XCTreeLang/XCTreeLang/Statements/XCTLMorethanStatement.swift"
+                  startingColumnNumber = "9223372036854775807"
+                  endingColumnNumber = "9223372036854775807"
+                  startingLineNumber = "53"
+                  endingLineNumber = "53"
+                  offsetFromSymbolStart = "2048">
+               </Location>
             </Locations>
             </Locations>
          </BreakpointContent>
          </BreakpointContent>
       </BreakpointProxy>
       </BreakpointProxy>
@@ -577,6 +682,21 @@
                   endingLineNumber = "62"
                   endingLineNumber = "62"
                   offsetFromSymbolStart = "1060">
                   offsetFromSymbolStart = "1060">
                </Location>
                </Location>
+               <Location
+                  uuid = "4D995B8D-8DF5-4246-B928-809413B74EE8 - e06e50c0e5a635bd"
+                  shouldBeEnabled = "Yes"
+                  ignoreCount = "0"
+                  continueAfterRunningActions = "No"
+                  symbolName = "XCTreeLang.XCTLMorethanStatement.evaluate(inContext: XCTreeLang.XCTLRuntimeAbstractContext) throws -&gt; XCTreeLang.XCTLRuntimeVariable"
+                  moduleName = "XCTreeLang"
+                  usesParentBreakpointCondition = "Yes"
+                  urlString = "file:///Users/xcbosa/Documents/LibraryProjects/XCTreeLang/XCTreeLang/Statements/XCTLMorethanStatement.swift"
+                  startingColumnNumber = "9223372036854775807"
+                  endingColumnNumber = "9223372036854775807"
+                  startingLineNumber = "62"
+                  endingLineNumber = "62"
+                  offsetFromSymbolStart = "1096">
+               </Location>
             </Locations>
             </Locations>
          </BreakpointContent>
          </BreakpointContent>
       </BreakpointProxy>
       </BreakpointProxy>
@@ -625,6 +745,21 @@
                   endingLineNumber = "65"
                   endingLineNumber = "65"
                   offsetFromSymbolStart = "1444">
                   offsetFromSymbolStart = "1444">
                </Location>
                </Location>
+               <Location
+                  uuid = "587D9FDF-0913-4C57-A5C2-CACC492FAA36 - e06e50c0e5a63458"
+                  shouldBeEnabled = "Yes"
+                  ignoreCount = "0"
+                  continueAfterRunningActions = "No"
+                  symbolName = "XCTreeLang.XCTLMorethanStatement.evaluate(inContext: XCTreeLang.XCTLRuntimeAbstractContext) throws -&gt; XCTreeLang.XCTLRuntimeVariable"
+                  moduleName = "XCTreeLang"
+                  usesParentBreakpointCondition = "Yes"
+                  urlString = "file:///Users/xcbosa/Documents/LibraryProjects/XCTreeLang/XCTreeLang/Statements/XCTLMorethanStatement.swift"
+                  startingColumnNumber = "9223372036854775807"
+                  endingColumnNumber = "9223372036854775807"
+                  startingLineNumber = "65"
+                  endingLineNumber = "65"
+                  offsetFromSymbolStart = "1504">
+               </Location>
             </Locations>
             </Locations>
          </BreakpointContent>
          </BreakpointContent>
       </BreakpointProxy>
       </BreakpointProxy>
@@ -673,6 +808,21 @@
                   endingLineNumber = "62"
                   endingLineNumber = "62"
                   offsetFromSymbolStart = "1060">
                   offsetFromSymbolStart = "1060">
                </Location>
                </Location>
+               <Location
+                  uuid = "BFE888DF-761B-43C6-8561-25412C711F3F - 22f22d847ab15f7d"
+                  shouldBeEnabled = "Yes"
+                  ignoreCount = "0"
+                  continueAfterRunningActions = "No"
+                  symbolName = "XCTreeLang.XCTLLessthanStatement.evaluate(inContext: XCTreeLang.XCTLRuntimeAbstractContext) throws -&gt; XCTreeLang.XCTLRuntimeVariable"
+                  moduleName = "XCTreeLang"
+                  usesParentBreakpointCondition = "Yes"
+                  urlString = "file:///Users/xcbosa/Documents/LibraryProjects/XCTreeLang/XCTreeLang/Statements/XCTLLessthanStatement.swift"
+                  startingColumnNumber = "9223372036854775807"
+                  endingColumnNumber = "9223372036854775807"
+                  startingLineNumber = "62"
+                  endingLineNumber = "62"
+                  offsetFromSymbolStart = "1096">
+               </Location>
             </Locations>
             </Locations>
          </BreakpointContent>
          </BreakpointContent>
       </BreakpointProxy>
       </BreakpointProxy>
@@ -721,25 +871,24 @@
                   endingLineNumber = "65"
                   endingLineNumber = "65"
                   offsetFromSymbolStart = "1444">
                   offsetFromSymbolStart = "1444">
                </Location>
                </Location>
+               <Location
+                  uuid = "E6E67FFE-B566-47BA-8D1F-AAE8337CB438 - 22f22d847ab15c80"
+                  shouldBeEnabled = "Yes"
+                  ignoreCount = "0"
+                  continueAfterRunningActions = "No"
+                  symbolName = "XCTreeLang.XCTLLessthanStatement.evaluate(inContext: XCTreeLang.XCTLRuntimeAbstractContext) throws -&gt; XCTreeLang.XCTLRuntimeVariable"
+                  moduleName = "XCTreeLang"
+                  usesParentBreakpointCondition = "Yes"
+                  urlString = "file:///Users/xcbosa/Documents/LibraryProjects/XCTreeLang/XCTreeLang/Statements/XCTLLessthanStatement.swift"
+                  startingColumnNumber = "9223372036854775807"
+                  endingColumnNumber = "9223372036854775807"
+                  startingLineNumber = "65"
+                  endingLineNumber = "65"
+                  offsetFromSymbolStart = "1504">
+               </Location>
             </Locations>
             </Locations>
          </BreakpointContent>
          </BreakpointContent>
       </BreakpointProxy>
       </BreakpointProxy>
-      <BreakpointProxy
-         BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
-         <BreakpointContent
-            uuid = "E9505515-9E5C-4EFE-9B32-A48E0B2D4CFB"
-            shouldBeEnabled = "Yes"
-            ignoreCount = "0"
-            continueAfterRunningActions = "No"
-            filePath = "XCTreeLang/Statements/VirtualStatement/XCTLListStatement.swift"
-            startingColumnNumber = "9223372036854775807"
-            endingColumnNumber = "9223372036854775807"
-            startingLineNumber = "45"
-            endingLineNumber = "45"
-            landmarkName = "parseStatement(fromLexerToSelf:fromParent:)"
-            landmarkType = "7">
-         </BreakpointContent>
-      </BreakpointProxy>
       <BreakpointProxy
       <BreakpointProxy
          BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
          BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
          <BreakpointContent
          <BreakpointContent
@@ -798,28 +947,28 @@
             filePath = "XCTreeLang/Statements/XCTLVariableRefStatement.swift"
             filePath = "XCTreeLang/Statements/XCTLVariableRefStatement.swift"
             startingColumnNumber = "9223372036854775807"
             startingColumnNumber = "9223372036854775807"
             endingColumnNumber = "9223372036854775807"
             endingColumnNumber = "9223372036854775807"
-            startingLineNumber = "124"
-            endingLineNumber = "124"
+            startingLineNumber = "139"
+            endingLineNumber = "139"
             landmarkName = "evaluateBack(_:inContext:)"
             landmarkName = "evaluateBack(_:inContext:)"
             landmarkType = "7">
             landmarkType = "7">
             <Locations>
             <Locations>
                <Location
                <Location
-                  uuid = "C3B0488E-C243-48F8-A91B-52C5156798CE - 819511eaf925e82a"
+                  uuid = "C3B0488E-C243-48F8-A91B-52C5156798CE - b2953dc3cfc33aeb"
                   shouldBeEnabled = "Yes"
                   shouldBeEnabled = "Yes"
                   ignoreCount = "0"
                   ignoreCount = "0"
                   continueAfterRunningActions = "No"
                   continueAfterRunningActions = "No"
-                  symbolName = "XCTreeLang.XCTLVariableRefStatement.evaluate(inContext: XCTreeLang.XCTLRuntimeAbstractContext) throws -&gt; XCTreeLang.XCTLRuntimeVariable"
+                  symbolName = "XCTreeLang.XCTLVariableRefStatement.evaluateBack(_: XCTreeLang.XCTLRuntimeVariable, inContext: XCTreeLang.XCTLRuntimeAbstractContext) throws -&gt; XCTreeLang.XCTLRuntimeVariable"
                   moduleName = "XCTreeLang"
                   moduleName = "XCTreeLang"
                   usesParentBreakpointCondition = "Yes"
                   usesParentBreakpointCondition = "Yes"
                   urlString = "file:///Users/xcbosa/Documents/LibraryProjects/XCTreeLang/XCTreeLang/Statements/XCTLVariableRefStatement.swift"
                   urlString = "file:///Users/xcbosa/Documents/LibraryProjects/XCTreeLang/XCTreeLang/Statements/XCTLVariableRefStatement.swift"
                   startingColumnNumber = "9223372036854775807"
                   startingColumnNumber = "9223372036854775807"
                   endingColumnNumber = "9223372036854775807"
                   endingColumnNumber = "9223372036854775807"
-                  startingLineNumber = "102"
-                  endingLineNumber = "102"
-                  offsetFromSymbolStart = "2100">
+                  startingLineNumber = "136"
+                  endingLineNumber = "136"
+                  offsetFromSymbolStart = "992">
                </Location>
                </Location>
                <Location
                <Location
-                  uuid = "C3B0488E-C243-48F8-A91B-52C5156798CE - b2953dc3cfc33d7f"
+                  uuid = "C3B0488E-C243-48F8-A91B-52C5156798CE - b2953dc3cfc33aeb"
                   shouldBeEnabled = "Yes"
                   shouldBeEnabled = "Yes"
                   ignoreCount = "0"
                   ignoreCount = "0"
                   continueAfterRunningActions = "No"
                   continueAfterRunningActions = "No"
@@ -829,10 +978,40 @@
                   urlString = "file:///Users/xcbosa/Documents/LibraryProjects/XCTreeLang/XCTreeLang/Statements/XCTLVariableRefStatement.swift"
                   urlString = "file:///Users/xcbosa/Documents/LibraryProjects/XCTreeLang/XCTreeLang/Statements/XCTLVariableRefStatement.swift"
                   startingColumnNumber = "9223372036854775807"
                   startingColumnNumber = "9223372036854775807"
                   endingColumnNumber = "9223372036854775807"
                   endingColumnNumber = "9223372036854775807"
-                  startingLineNumber = "124"
-                  endingLineNumber = "124"
+                  startingLineNumber = "136"
+                  endingLineNumber = "136"
                   offsetFromSymbolStart = "820">
                   offsetFromSymbolStart = "820">
                </Location>
                </Location>
+               <Location
+                  uuid = "C3B0488E-C243-48F8-A91B-52C5156798CE - b2953dc3cfc33b0c"
+                  shouldBeEnabled = "Yes"
+                  ignoreCount = "0"
+                  continueAfterRunningActions = "No"
+                  symbolName = "XCTreeLang.XCTLVariableRefStatement.evaluateBack(_: XCTreeLang.XCTLRuntimeVariable, inContext: XCTreeLang.XCTLRuntimeAbstractContext) throws -&gt; XCTreeLang.XCTLRuntimeVariable"
+                  moduleName = "XCTreeLang"
+                  usesParentBreakpointCondition = "Yes"
+                  urlString = "file:///Users/xcbosa/Documents/LibraryProjects/XCTreeLang/XCTreeLang/Statements/XCTLVariableRefStatement.swift"
+                  startingColumnNumber = "9223372036854775807"
+                  endingColumnNumber = "9223372036854775807"
+                  startingLineNumber = "139"
+                  endingLineNumber = "139"
+                  offsetFromSymbolStart = "820">
+               </Location>
+               <Location
+                  uuid = "C3B0488E-C243-48F8-A91B-52C5156798CE - b2953dc3cfc33b0c"
+                  shouldBeEnabled = "Yes"
+                  ignoreCount = "0"
+                  continueAfterRunningActions = "No"
+                  symbolName = "XCTreeLang.XCTLVariableRefStatement.evaluateBack(_: XCTreeLang.XCTLRuntimeVariable, inContext: XCTreeLang.XCTLRuntimeAbstractContext) throws -&gt; XCTreeLang.XCTLRuntimeVariable"
+                  moduleName = "XCTreeLang"
+                  usesParentBreakpointCondition = "Yes"
+                  urlString = "file:///Users/xcbosa/Documents/LibraryProjects/XCTreeLang/XCTreeLang/Statements/XCTLVariableRefStatement.swift"
+                  startingColumnNumber = "9223372036854775807"
+                  endingColumnNumber = "9223372036854775807"
+                  startingLineNumber = "139"
+                  endingLineNumber = "139"
+                  offsetFromSymbolStart = "844">
+               </Location>
             </Locations>
             </Locations>
          </BreakpointContent>
          </BreakpointContent>
       </BreakpointProxy>
       </BreakpointProxy>
@@ -846,13 +1025,13 @@
             filePath = "XCTreeLang/Statements/XCTLVariableRefStatement.swift"
             filePath = "XCTreeLang/Statements/XCTLVariableRefStatement.swift"
             startingColumnNumber = "9223372036854775807"
             startingColumnNumber = "9223372036854775807"
             endingColumnNumber = "9223372036854775807"
             endingColumnNumber = "9223372036854775807"
-            startingLineNumber = "138"
-            endingLineNumber = "138"
+            startingLineNumber = "153"
+            endingLineNumber = "153"
             landmarkName = "evaluateBack(_:inContext:)"
             landmarkName = "evaluateBack(_:inContext:)"
             landmarkType = "7">
             landmarkType = "7">
             <Locations>
             <Locations>
                <Location
                <Location
-                  uuid = "C0E92D41-309C-419D-BDAE-E705374FB334 - b2953dc3cfc33b2d"
+                  uuid = "C0E92D41-309C-419D-BDAE-E705374FB334 - b2953dc3cfc33899"
                   shouldBeEnabled = "Yes"
                   shouldBeEnabled = "Yes"
                   ignoreCount = "0"
                   ignoreCount = "0"
                   continueAfterRunningActions = "No"
                   continueAfterRunningActions = "No"
@@ -862,12 +1041,12 @@
                   urlString = "file:///Users/xcbosa/Documents/LibraryProjects/XCTreeLang/XCTreeLang/Statements/XCTLVariableRefStatement.swift"
                   urlString = "file:///Users/xcbosa/Documents/LibraryProjects/XCTreeLang/XCTreeLang/Statements/XCTLVariableRefStatement.swift"
                   startingColumnNumber = "9223372036854775807"
                   startingColumnNumber = "9223372036854775807"
                   endingColumnNumber = "9223372036854775807"
                   endingColumnNumber = "9223372036854775807"
-                  startingLineNumber = "138"
-                  endingLineNumber = "138"
-                  offsetFromSymbolStart = "1716">
+                  startingLineNumber = "150"
+                  endingLineNumber = "150"
+                  offsetFromSymbolStart = "2020">
                </Location>
                </Location>
                <Location
                <Location
-                  uuid = "C0E92D41-309C-419D-BDAE-E705374FB334 - b2953dc3cfc33b2d"
+                  uuid = "C0E92D41-309C-419D-BDAE-E705374FB334 - b2953dc3cfc33899"
                   shouldBeEnabled = "Yes"
                   shouldBeEnabled = "Yes"
                   ignoreCount = "0"
                   ignoreCount = "0"
                   continueAfterRunningActions = "No"
                   continueAfterRunningActions = "No"
@@ -877,10 +1056,40 @@
                   urlString = "file:///Users/xcbosa/Documents/LibraryProjects/XCTreeLang/XCTreeLang/Statements/XCTLVariableRefStatement.swift"
                   urlString = "file:///Users/xcbosa/Documents/LibraryProjects/XCTreeLang/XCTreeLang/Statements/XCTLVariableRefStatement.swift"
                   startingColumnNumber = "9223372036854775807"
                   startingColumnNumber = "9223372036854775807"
                   endingColumnNumber = "9223372036854775807"
                   endingColumnNumber = "9223372036854775807"
-                  startingLineNumber = "138"
-                  endingLineNumber = "138"
+                  startingLineNumber = "150"
+                  endingLineNumber = "150"
                   offsetFromSymbolStart = "1800">
                   offsetFromSymbolStart = "1800">
                </Location>
                </Location>
+               <Location
+                  uuid = "C0E92D41-309C-419D-BDAE-E705374FB334 - b2953dc3cfc3393a"
+                  shouldBeEnabled = "Yes"
+                  ignoreCount = "0"
+                  continueAfterRunningActions = "No"
+                  symbolName = "XCTreeLang.XCTLVariableRefStatement.evaluateBack(_: XCTreeLang.XCTLRuntimeVariable, inContext: XCTreeLang.XCTLRuntimeAbstractContext) throws -&gt; XCTreeLang.XCTLRuntimeVariable"
+                  moduleName = "XCTreeLang"
+                  usesParentBreakpointCondition = "Yes"
+                  urlString = "file:///Users/xcbosa/Documents/LibraryProjects/XCTreeLang/XCTreeLang/Statements/XCTLVariableRefStatement.swift"
+                  startingColumnNumber = "9223372036854775807"
+                  endingColumnNumber = "9223372036854775807"
+                  startingLineNumber = "153"
+                  endingLineNumber = "153"
+                  offsetFromSymbolStart = "1800">
+               </Location>
+               <Location
+                  uuid = "C0E92D41-309C-419D-BDAE-E705374FB334 - b2953dc3cfc3393a"
+                  shouldBeEnabled = "Yes"
+                  ignoreCount = "0"
+                  continueAfterRunningActions = "No"
+                  symbolName = "XCTreeLang.XCTLVariableRefStatement.evaluateBack(_: XCTreeLang.XCTLRuntimeVariable, inContext: XCTreeLang.XCTLRuntimeAbstractContext) throws -&gt; XCTreeLang.XCTLRuntimeVariable"
+                  moduleName = "XCTreeLang"
+                  usesParentBreakpointCondition = "Yes"
+                  urlString = "file:///Users/xcbosa/Documents/LibraryProjects/XCTreeLang/XCTreeLang/Statements/XCTLVariableRefStatement.swift"
+                  startingColumnNumber = "9223372036854775807"
+                  endingColumnNumber = "9223372036854775807"
+                  startingLineNumber = "153"
+                  endingLineNumber = "153"
+                  offsetFromSymbolStart = "1848">
+               </Location>
             </Locations>
             </Locations>
          </BreakpointContent>
          </BreakpointContent>
       </BreakpointProxy>
       </BreakpointProxy>
@@ -894,13 +1103,13 @@
             filePath = "XCTreeLang/Statements/XCTLVariableRefStatement.swift"
             filePath = "XCTreeLang/Statements/XCTLVariableRefStatement.swift"
             startingColumnNumber = "9223372036854775807"
             startingColumnNumber = "9223372036854775807"
             endingColumnNumber = "9223372036854775807"
             endingColumnNumber = "9223372036854775807"
-            startingLineNumber = "141"
-            endingLineNumber = "141"
+            startingLineNumber = "156"
+            endingLineNumber = "156"
             landmarkName = "evaluateBack(_:inContext:)"
             landmarkName = "evaluateBack(_:inContext:)"
             landmarkType = "7">
             landmarkType = "7">
             <Locations>
             <Locations>
                <Location
                <Location
-                  uuid = "13C4A8A4-B94A-43B8-8601-88F10E7EAC2A - b2953dc3cfc33b4e"
+                  uuid = "13C4A8A4-B94A-43B8-8601-88F10E7EAC2A - b2953dc3cfc3391d"
                   shouldBeEnabled = "Yes"
                   shouldBeEnabled = "Yes"
                   ignoreCount = "0"
                   ignoreCount = "0"
                   continueAfterRunningActions = "No"
                   continueAfterRunningActions = "No"
@@ -910,12 +1119,27 @@
                   urlString = "file:///Users/xcbosa/Documents/LibraryProjects/XCTreeLang/XCTreeLang/Statements/XCTLVariableRefStatement.swift"
                   urlString = "file:///Users/xcbosa/Documents/LibraryProjects/XCTreeLang/XCTreeLang/Statements/XCTLVariableRefStatement.swift"
                   startingColumnNumber = "9223372036854775807"
                   startingColumnNumber = "9223372036854775807"
                   endingColumnNumber = "9223372036854775807"
                   endingColumnNumber = "9223372036854775807"
-                  startingLineNumber = "141"
-                  endingLineNumber = "141"
-                  offsetFromSymbolStart = "2020">
+                  startingLineNumber = "154"
+                  endingLineNumber = "154"
+                  offsetFromSymbolStart = "2204">
+               </Location>
+               <Location
+                  uuid = "13C4A8A4-B94A-43B8-8601-88F10E7EAC2A - b2953dc3cfc3393a"
+                  shouldBeEnabled = "Yes"
+                  ignoreCount = "0"
+                  continueAfterRunningActions = "No"
+                  symbolName = "XCTreeLang.XCTLVariableRefStatement.evaluateBack(_: XCTreeLang.XCTLRuntimeVariable, inContext: XCTreeLang.XCTLRuntimeAbstractContext) throws -&gt; XCTreeLang.XCTLRuntimeVariable"
+                  moduleName = "XCTreeLang"
+                  usesParentBreakpointCondition = "Yes"
+                  urlString = "file:///Users/xcbosa/Documents/LibraryProjects/XCTreeLang/XCTreeLang/Statements/XCTLVariableRefStatement.swift"
+                  startingColumnNumber = "9223372036854775807"
+                  endingColumnNumber = "9223372036854775807"
+                  startingLineNumber = "153"
+                  endingLineNumber = "153"
+                  offsetFromSymbolStart = "2396">
                </Location>
                </Location>
                <Location
                <Location
-                  uuid = "13C4A8A4-B94A-43B8-8601-88F10E7EAC2A - b2953dc3cfc33b4e"
+                  uuid = "13C4A8A4-B94A-43B8-8601-88F10E7EAC2A - b2953dc3cfc3395f"
                   shouldBeEnabled = "Yes"
                   shouldBeEnabled = "Yes"
                   ignoreCount = "0"
                   ignoreCount = "0"
                   continueAfterRunningActions = "No"
                   continueAfterRunningActions = "No"
@@ -925,10 +1149,181 @@
                   urlString = "file:///Users/xcbosa/Documents/LibraryProjects/XCTreeLang/XCTreeLang/Statements/XCTLVariableRefStatement.swift"
                   urlString = "file:///Users/xcbosa/Documents/LibraryProjects/XCTreeLang/XCTreeLang/Statements/XCTLVariableRefStatement.swift"
                   startingColumnNumber = "9223372036854775807"
                   startingColumnNumber = "9223372036854775807"
                   endingColumnNumber = "9223372036854775807"
                   endingColumnNumber = "9223372036854775807"
-                  startingLineNumber = "141"
-                  endingLineNumber = "141"
+                  startingLineNumber = "156"
+                  endingLineNumber = "156"
                   offsetFromSymbolStart = "2396">
                   offsetFromSymbolStart = "2396">
                </Location>
                </Location>
+               <Location
+                  uuid = "13C4A8A4-B94A-43B8-8601-88F10E7EAC2A - b2953dc3cfc3395f"
+                  shouldBeEnabled = "Yes"
+                  ignoreCount = "0"
+                  continueAfterRunningActions = "No"
+                  symbolName = "XCTreeLang.XCTLVariableRefStatement.evaluateBack(_: XCTreeLang.XCTLRuntimeVariable, inContext: XCTreeLang.XCTLRuntimeAbstractContext) throws -&gt; XCTreeLang.XCTLRuntimeVariable"
+                  moduleName = "XCTreeLang"
+                  usesParentBreakpointCondition = "Yes"
+                  urlString = "file:///Users/xcbosa/Documents/LibraryProjects/XCTreeLang/XCTreeLang/Statements/XCTLVariableRefStatement.swift"
+                  startingColumnNumber = "9223372036854775807"
+                  endingColumnNumber = "9223372036854775807"
+                  startingLineNumber = "156"
+                  endingLineNumber = "156"
+                  offsetFromSymbolStart = "2444">
+               </Location>
+            </Locations>
+         </BreakpointContent>
+      </BreakpointProxy>
+      <BreakpointProxy
+         BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
+         <BreakpointContent
+            uuid = "4D7F9232-F6DA-4173-82A0-FC2A293AB3FF"
+            shouldBeEnabled = "Yes"
+            ignoreCount = "0"
+            continueAfterRunningActions = "No"
+            filePath = "XCTreeLang/Statements/XCTLVariableRefStatement.swift"
+            startingColumnNumber = "9223372036854775807"
+            endingColumnNumber = "9223372036854775807"
+            startingLineNumber = "108"
+            endingLineNumber = "108"
+            landmarkName = "evaluate(inContext:)"
+            landmarkType = "7">
+            <Locations>
+               <Location
+                  uuid = "4D7F9232-F6DA-4173-82A0-FC2A293AB3FF - 819511eaf925e889"
+                  shouldBeEnabled = "Yes"
+                  ignoreCount = "0"
+                  continueAfterRunningActions = "No"
+                  symbolName = "XCTreeLang.XCTLVariableRefStatement.evaluate(inContext: XCTreeLang.XCTLRuntimeAbstractContext) throws -&gt; XCTreeLang.XCTLRuntimeVariable"
+                  moduleName = "XCTreeLang"
+                  usesParentBreakpointCondition = "Yes"
+                  urlString = "file:///Users/xcbosa/Documents/LibraryProjects/XCTreeLang/XCTreeLang/Statements/XCTLVariableRefStatement.swift"
+                  startingColumnNumber = "9223372036854775807"
+                  endingColumnNumber = "9223372036854775807"
+                  startingLineNumber = "105"
+                  endingLineNumber = "105"
+                  offsetFromSymbolStart = "2676">
+               </Location>
+               <Location
+                  uuid = "4D7F9232-F6DA-4173-82A0-FC2A293AB3FF - 819511eaf925e889"
+                  shouldBeEnabled = "Yes"
+                  ignoreCount = "0"
+                  continueAfterRunningActions = "No"
+                  symbolName = "XCTreeLang.XCTLVariableRefStatement.evaluate(inContext: XCTreeLang.XCTLRuntimeAbstractContext) throws -&gt; XCTreeLang.XCTLRuntimeVariable"
+                  moduleName = "XCTreeLang"
+                  usesParentBreakpointCondition = "Yes"
+                  urlString = "file:///Users/xcbosa/Documents/LibraryProjects/XCTreeLang/XCTreeLang/Statements/XCTLVariableRefStatement.swift"
+                  startingColumnNumber = "9223372036854775807"
+                  endingColumnNumber = "9223372036854775807"
+                  startingLineNumber = "105"
+                  endingLineNumber = "105"
+                  offsetFromSymbolStart = "2564">
+               </Location>
+               <Location
+                  uuid = "4D7F9232-F6DA-4173-82A0-FC2A293AB3FF - 819511eaf925e96c"
+                  shouldBeEnabled = "Yes"
+                  ignoreCount = "0"
+                  continueAfterRunningActions = "No"
+                  symbolName = "XCTreeLang.XCTLVariableRefStatement.evaluate(inContext: XCTreeLang.XCTLRuntimeAbstractContext) throws -&gt; XCTreeLang.XCTLRuntimeVariable"
+                  moduleName = "XCTreeLang"
+                  usesParentBreakpointCondition = "Yes"
+                  urlString = "file:///Users/xcbosa/Documents/LibraryProjects/XCTreeLang/XCTreeLang/Statements/XCTLVariableRefStatement.swift"
+                  startingColumnNumber = "9223372036854775807"
+                  endingColumnNumber = "9223372036854775807"
+                  startingLineNumber = "108"
+                  endingLineNumber = "108"
+                  offsetFromSymbolStart = "2564">
+               </Location>
+               <Location
+                  uuid = "4D7F9232-F6DA-4173-82A0-FC2A293AB3FF - 819511eaf925e96c"
+                  shouldBeEnabled = "Yes"
+                  ignoreCount = "0"
+                  continueAfterRunningActions = "No"
+                  symbolName = "XCTreeLang.XCTLVariableRefStatement.evaluate(inContext: XCTreeLang.XCTLRuntimeAbstractContext) throws -&gt; XCTreeLang.XCTLRuntimeVariable"
+                  moduleName = "XCTreeLang"
+                  usesParentBreakpointCondition = "Yes"
+                  urlString = "file:///Users/xcbosa/Documents/LibraryProjects/XCTreeLang/XCTreeLang/Statements/XCTLVariableRefStatement.swift"
+                  startingColumnNumber = "9223372036854775807"
+                  endingColumnNumber = "9223372036854775807"
+                  startingLineNumber = "108"
+                  endingLineNumber = "108"
+                  offsetFromSymbolStart = "2596">
+               </Location>
+            </Locations>
+         </BreakpointContent>
+      </BreakpointProxy>
+      <BreakpointProxy
+         BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
+         <BreakpointContent
+            uuid = "F8BFE289-40FB-4CC2-8200-C286FC68D912"
+            shouldBeEnabled = "Yes"
+            ignoreCount = "0"
+            continueAfterRunningActions = "No"
+            filePath = "XCTreeLang/Statements/XCTLVariableRefStatement.swift"
+            startingColumnNumber = "9223372036854775807"
+            endingColumnNumber = "9223372036854775807"
+            startingLineNumber = "111"
+            endingLineNumber = "111"
+            landmarkName = "evaluate(inContext:)"
+            landmarkType = "7">
+            <Locations>
+               <Location
+                  uuid = "F8BFE289-40FB-4CC2-8200-C286FC68D912 - 819511eaf925e96c"
+                  shouldBeEnabled = "Yes"
+                  ignoreCount = "0"
+                  continueAfterRunningActions = "No"
+                  symbolName = "XCTreeLang.XCTLVariableRefStatement.evaluate(inContext: XCTreeLang.XCTLRuntimeAbstractContext) throws -&gt; XCTreeLang.XCTLRuntimeVariable"
+                  moduleName = "XCTreeLang"
+                  usesParentBreakpointCondition = "Yes"
+                  urlString = "file:///Users/xcbosa/Documents/LibraryProjects/XCTreeLang/XCTreeLang/Statements/XCTLVariableRefStatement.swift"
+                  startingColumnNumber = "9223372036854775807"
+                  endingColumnNumber = "9223372036854775807"
+                  startingLineNumber = "108"
+                  endingLineNumber = "108"
+                  offsetFromSymbolStart = "2860">
+               </Location>
+               <Location
+                  uuid = "F8BFE289-40FB-4CC2-8200-C286FC68D912 - 819511eaf925e96c"
+                  shouldBeEnabled = "Yes"
+                  ignoreCount = "0"
+                  continueAfterRunningActions = "No"
+                  symbolName = "XCTreeLang.XCTLVariableRefStatement.evaluate(inContext: XCTreeLang.XCTLRuntimeAbstractContext) throws -&gt; XCTreeLang.XCTLRuntimeVariable"
+                  moduleName = "XCTreeLang"
+                  usesParentBreakpointCondition = "Yes"
+                  urlString = "file:///Users/xcbosa/Documents/LibraryProjects/XCTreeLang/XCTreeLang/Statements/XCTLVariableRefStatement.swift"
+                  startingColumnNumber = "9223372036854775807"
+                  endingColumnNumber = "9223372036854775807"
+                  startingLineNumber = "108"
+                  endingLineNumber = "108"
+                  offsetFromSymbolStart = "3160">
+               </Location>
+               <Location
+                  uuid = "F8BFE289-40FB-4CC2-8200-C286FC68D912 - 819511eaf925e9c3"
+                  shouldBeEnabled = "Yes"
+                  ignoreCount = "0"
+                  continueAfterRunningActions = "No"
+                  symbolName = "XCTreeLang.XCTLVariableRefStatement.evaluate(inContext: XCTreeLang.XCTLRuntimeAbstractContext) throws -&gt; XCTreeLang.XCTLRuntimeVariable"
+                  moduleName = "XCTreeLang"
+                  usesParentBreakpointCondition = "Yes"
+                  urlString = "file:///Users/xcbosa/Documents/LibraryProjects/XCTreeLang/XCTreeLang/Statements/XCTLVariableRefStatement.swift"
+                  startingColumnNumber = "9223372036854775807"
+                  endingColumnNumber = "9223372036854775807"
+                  startingLineNumber = "111"
+                  endingLineNumber = "111"
+                  offsetFromSymbolStart = "3160">
+               </Location>
+               <Location
+                  uuid = "F8BFE289-40FB-4CC2-8200-C286FC68D912 - 819511eaf925e9c3"
+                  shouldBeEnabled = "Yes"
+                  ignoreCount = "0"
+                  continueAfterRunningActions = "No"
+                  symbolName = "XCTreeLang.XCTLVariableRefStatement.evaluate(inContext: XCTreeLang.XCTLRuntimeAbstractContext) throws -&gt; XCTreeLang.XCTLRuntimeVariable"
+                  moduleName = "XCTreeLang"
+                  usesParentBreakpointCondition = "Yes"
+                  urlString = "file:///Users/xcbosa/Documents/LibraryProjects/XCTreeLang/XCTreeLang/Statements/XCTLVariableRefStatement.swift"
+                  startingColumnNumber = "9223372036854775807"
+                  endingColumnNumber = "9223372036854775807"
+                  startingLineNumber = "111"
+                  endingLineNumber = "111"
+                  offsetFromSymbolStart = "3192">
+               </Location>
             </Locations>
             </Locations>
          </BreakpointContent>
          </BreakpointContent>
       </BreakpointProxy>
       </BreakpointProxy>

+ 40 - 0
XCTreeLang/NativeTypes/Extension/NSArray+Enumerator.swift

@@ -0,0 +1,40 @@
+//
+//  Range.swift
+//  XCTreeLang
+//
+//  Created by 邢铖 on 2023/6/3.
+//
+
+import Foundation
+
+public class NSArrayTLEnumerator: XCTLEnumerator {
+    
+    public var array: NSArray
+    
+    private var index = 0
+    
+    public init(array: NSArray) {
+        self.array = array
+    }
+    
+    public func moveNext() -> XCTLRuntimeVariable {
+        if self.index < self.array.count {
+            if let value = self.array[index] as? NSObject {
+                self.index += 1
+                return XCTLRuntimeVariable(rawObject: value)
+            }
+            self.index += 1
+            return moveNext()
+        }
+        return .void
+    }
+    
+}
+
+extension NSArray: XCTLEnumeratorProvider {
+    
+    public func provideEnumerator() -> XCTLEnumerator {
+        return NSArrayTLEnumerator(array: self)
+    }
+    
+}

+ 8 - 0
XCTreeLang/NativeTypes/XCTLEnumerator.swift

@@ -7,8 +7,16 @@
 
 
 import Foundation
 import Foundation
 
 
+@objc
 public protocol XCTLEnumerator {
 public protocol XCTLEnumerator {
     
     
     func moveNext() -> XCTLRuntimeVariable
     func moveNext() -> XCTLRuntimeVariable
     
     
 }
 }
+
+@objc
+public protocol XCTLEnumeratorProvider {
+    
+    func provideEnumerator() -> XCTLEnumerator
+    
+}

+ 54 - 0
XCTreeLang/Runtime/Type/Instance/XCTLInvocation.h

@@ -0,0 +1,54 @@
+//
+//  XCTLInvocation.h
+//  XCTreeLang
+//
+//  Created by 邢铖 on 2023/6/3.
+//
+
+#import <Foundation/Foundation.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface XCTLInvocation : NSObject
+
+- (instancetype)initWithObject:(NSObject *)object forSelector:(SEL)selector;
+
+- (NSInteger)numberOfArguments;
+- (NSString *)typeEncodingForArgumentAtIndex:(NSInteger)index;
+- (void)setRawArgument:(void *)rawPointer atIndex:(NSInteger)index;
+- (void)setArgument_c:(char)value atIndex:(NSInteger)index;
+- (void)setArgument_s:(short)value atIndex:(NSInteger)index;
+- (void)setArgument_i:(int)value atIndex:(NSInteger)index;
+- (void)setArgument_q:(long long)value atIndex:(NSInteger)index;
+- (void)setArgument_C:(unsigned char)value atIndex:(NSInteger)index;
+- (void)setArgument_S:(unsigned short)value atIndex:(NSInteger)index;
+- (void)setArgument_I:(unsigned int)value atIndex:(NSInteger)index;
+- (void)setArgument_Q:(unsigned long long)value atIndex:(NSInteger)index;
+- (void)setArgument_L:(unsigned long)value atIndex:(NSInteger)index;
+- (void)setArgument_f:(float)value atIndex:(NSInteger)index;
+- (void)setArgument_d:(double)value atIndex:(NSInteger)index;
+- (void)setArgument_B:(bool)value atIndex:(NSInteger)index;
+- (void)setArgument_star:(NSString *)value atIndex:(NSInteger)index;
+- (void)setArgument_at:(NSObject *)value atIndex:(NSInteger)index;
+
+- (void)invoke;
+
+- (NSString *)methodReturnType;
+- (char)getReturnValue_c;
+- (short)getReturnValue_s;
+- (int)getReturnValue_i;
+- (long long)getReturnValue_q;
+- (unsigned char)getReturnValue_C;
+- (unsigned short)getReturnValue_S;
+- (unsigned int)getReturnValue_I;
+- (unsigned long long)getReturnValue_Q;
+- (unsigned long)getReturnValue_L;
+- (float)getReturnValue_F;
+- (double)getReturnValue_D;
+- (bool)getReturnValue_B;
+- (NSString *)getReturnValue_star;
+- (NSObject *)getReturnValue_at;
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 245 - 0
XCTreeLang/Runtime/Type/Instance/XCTLInvocation.m

@@ -0,0 +1,245 @@
+//
+//  XCTLInvocation.m
+//  XCTreeLang
+//
+//  Created by 邢铖 on 2023/6/3.
+//
+
+#import "XCTLInvocation.h"
+
+typedef union {
+    char c;
+    short s;
+    int i;
+    long l;
+    long long q;
+    unsigned char C;
+    unsigned short S;
+    unsigned int I;
+    unsigned long L;
+    unsigned long long Q;
+    float f;
+    double d;
+    bool B;
+    char buff1[1];
+    char buff2[2];
+    char buff4[4];
+    char buff8[8];
+    void *pointer;
+} XCTLStackableObject;
+
+@interface XCTLInvocation ()
+
+@property (strong) NSObject *target;
+@property (strong) NSInvocation *invocation;
+@property (strong) NSMethodSignature *methodSignature;
+@property (assign) char *returnValueBuffer;
+
+@end
+
+@implementation XCTLInvocation
+
+- (instancetype)initWithObject:(NSObject *)object forSelector:(SEL)selector {
+    self = [super init];
+    self.target = object;
+    self.methodSignature = [object methodSignatureForSelector:selector];
+    self.invocation = [NSInvocation invocationWithMethodSignature:self.methodSignature];
+    self.invocation.selector = selector;
+    [self.invocation retainArguments];
+    return self;
+}
+
+- (NSInteger)numberOfArguments {
+    return self.methodSignature.numberOfArguments;
+}
+
+- (NSString *)typeEncodingForArgumentAtIndex:(NSInteger)index {
+    const char *encoding = [self.methodSignature getArgumentTypeAtIndex:index];
+    return [NSString stringWithCString:encoding encoding:NSUTF8StringEncoding];
+}
+
+- (NSString *)methodReturnType {
+    return [NSString stringWithCString:self.methodSignature.methodReturnType encoding:NSUTF8StringEncoding];
+}
+
+- (void)setRawArgument:(void *)rawPointer atIndex:(NSInteger)index {
+    [self.invocation setArgument:rawPointer atIndex:index];
+}
+
+- (void)setArgument_c:(char)value atIndex:(NSInteger)index {
+    XCTLStackableObject obj;
+    obj.c = value;
+    [self setRawArgument:obj.buff1 atIndex:index];
+}
+
+- (void)setArgument_s:(short)value atIndex:(NSInteger)index {
+    XCTLStackableObject obj;
+    obj.s = value;
+    [self setRawArgument:obj.buff2 atIndex:index];
+}
+
+- (void)setArgument_i:(int)value atIndex:(NSInteger)index {
+    XCTLStackableObject obj;
+    obj.i = value;
+    [self setRawArgument:obj.buff4 atIndex:index];
+}
+
+- (void)setArgument_q:(long long)value atIndex:(NSInteger)index {
+    XCTLStackableObject obj;
+    obj.q = value;
+    [self setRawArgument:obj.buff8 atIndex:index];
+}
+
+- (void)setArgument_C:(unsigned char)value atIndex:(NSInteger)index {
+    XCTLStackableObject obj;
+    obj.C = value;
+    [self setRawArgument:obj.buff1 atIndex:index];
+}
+
+- (void)setArgument_S:(unsigned short)value atIndex:(NSInteger)index {
+    XCTLStackableObject obj;
+    obj.S = value;
+    [self setRawArgument:obj.buff2 atIndex:index];
+}
+
+- (void)setArgument_I:(unsigned int)value atIndex:(NSInteger)index {
+    XCTLStackableObject obj;
+    obj.I = value;
+    [self setRawArgument:obj.buff4 atIndex:index];
+}
+
+- (void)setArgument_Q:(unsigned long long)value atIndex:(NSInteger)index {
+    XCTLStackableObject obj;
+    obj.Q = value;
+    [self setRawArgument:obj.buff8 atIndex:index];
+}
+
+- (void)setArgument_L:(unsigned long)value atIndex:(NSInteger)index {
+    XCTLStackableObject obj;
+    obj.L = value;
+    [self setRawArgument:obj.buff4 atIndex:index];
+}
+
+- (void)setArgument_f:(float)value atIndex:(NSInteger)index {
+    XCTLStackableObject obj;
+    obj.f = value;
+    [self setRawArgument:obj.buff4 atIndex:index];
+}
+
+- (void)setArgument_d:(double)value atIndex:(NSInteger)index {
+    XCTLStackableObject obj;
+    obj.d = value;
+    [self setRawArgument:obj.buff8 atIndex:index];
+}
+
+- (void)setArgument_B:(bool)value atIndex:(NSInteger)index {
+    XCTLStackableObject obj;
+    obj.B = value;
+    [self setRawArgument:obj.buff1 atIndex:index];
+}
+
+- (void)setArgument_star:(NSString *)value atIndex:(NSInteger)index {
+    const char *cString = [value cStringUsingEncoding:NSUTF8StringEncoding];
+    [self setRawArgument:(char *)cString atIndex:index];
+}
+
+- (void)setArgument_at:(NSObject *)value atIndex:(NSInteger)index {
+    [self setRawArgument:&value atIndex:index];
+}
+
+- (void)invoke {
+    [self.invocation invokeWithTarget:self.target];
+    if (self.methodSignature.methodReturnLength) {
+        self.returnValueBuffer = calloc(self.methodSignature.methodReturnLength, sizeof(char));
+        [self.invocation getReturnValue:self.returnValueBuffer];
+    }
+}
+
+- (char)getReturnValue_c {
+    XCTLStackableObject obj;
+    memcpy(obj.buff1, self.returnValueBuffer, 1);
+    return obj.c;
+}
+
+- (short)getReturnValue_s {
+    XCTLStackableObject obj;
+    memcpy(obj.buff2, self.returnValueBuffer, 2);
+    return obj.s;
+}
+
+- (int)getReturnValue_i {
+    XCTLStackableObject obj;
+    memcpy(obj.buff4, self.returnValueBuffer, 4);
+    return obj.i;
+}
+
+- (long long)getReturnValue_q {
+    XCTLStackableObject obj;
+    memcpy(obj.buff8, self.returnValueBuffer, 8);
+    return obj.q;
+}
+
+- (unsigned char)getReturnValue_C {
+    XCTLStackableObject obj;
+    memcpy(obj.buff1, self.returnValueBuffer, 1);
+    return obj.C;
+}
+
+- (unsigned short)getReturnValue_S {
+    XCTLStackableObject obj;
+    memcpy(obj.buff2, self.returnValueBuffer, 2);
+    return obj.S;
+}
+
+- (unsigned int)getReturnValue_I {
+    XCTLStackableObject obj;
+    memcpy(obj.buff4, self.returnValueBuffer, 4);
+    return obj.I;
+}
+
+- (unsigned long long)getReturnValue_Q {
+    XCTLStackableObject obj;
+    memcpy(obj.buff8, self.returnValueBuffer, 8);
+    return obj.Q;
+}
+
+- (unsigned long)getReturnValue_L {
+    XCTLStackableObject obj;
+    memcpy(obj.buff4, self.returnValueBuffer, 4);
+    return obj.L;
+}
+
+- (float)getReturnValue_F {
+    XCTLStackableObject obj;
+    memcpy(obj.buff4, self.returnValueBuffer, 4);
+    return obj.f;
+}
+
+- (double)getReturnValue_D {
+    XCTLStackableObject obj;
+    memcpy(obj.buff8, self.returnValueBuffer, 8);
+    return obj.d;
+}
+
+- (bool)getReturnValue_B {
+    XCTLStackableObject obj;
+    memcpy(obj.buff1, self.returnValueBuffer, 1);
+    return obj.B;
+}
+
+- (NSString *)getReturnValue_star {
+    XCTLStackableObject obj;
+    memcpy(obj.buff8, self.returnValueBuffer, 8);
+    const char *pointer = obj.pointer;
+    return [NSString stringWithCString:pointer encoding:NSUTF8StringEncoding];
+}
+
+- (NSObject *)getReturnValue_at {
+    XCTLStackableObject obj;
+    memcpy(obj.buff8, self.returnValueBuffer, 8);
+    const void *pointer = obj.pointer;
+    return (__bridge NSObject *)pointer;
+}
+
+
+@end

+ 1 - 0
XCTreeLang/Runtime/Type/Instance/module.modulemap

@@ -1,4 +1,5 @@
 module XCTLRuntimeTypeInstanceModule {
 module XCTLRuntimeTypeInstanceModule {
     header "XCTLRuntimeTypeInstance.h"
     header "XCTLRuntimeTypeInstance.h"
+    header "XCTLInvocation.h"
     export *
     export *
 }
 }

+ 17 - 5
XCTreeLang/Runtime/XCTLRuntimeContext.swift

@@ -207,12 +207,24 @@ internal class XCTLRuntimeContext: XCTLRuntimeAbstractContext {
     }
     }
     
     
     internal func allocateObject(name: String, args: [XCTLRuntimeVariable]) throws -> XCTLRuntimeVariable {
     internal func allocateObject(name: String, args: [XCTLRuntimeVariable]) throws -> XCTLRuntimeVariable {
-        guard let generator = self.generators[name] else {
-            throw XCTLRuntimeError.generateProtocolNotFoundedError(name: name)
+        if let generator = self.generators[name] {
+            let nativeObject = try generator.initWithXCT(args.compactMap({ $0.nativeValue }))
+            let object = XCTLRuntimeVariable(rawObject: nativeObject)
+            return object
+        }
+        if let klass: AnyObject = NSClassFromString(name),
+           let klass = klass as? NSObject {
+            let invocation = try Invocation(target: klass, selector: NSSelectorFromString("alloc"))
+            invocation.invoke()
+            if let obj = invocation.returnedObject as? NSObject {
+                let invocation = try Invocation(target: obj, selector: NSSelectorFromString("init"))
+                invocation.invoke()
+                if let obj = invocation.returnedObject as? NSObject {
+                    return XCTLRuntimeVariable(rawObject: obj)
+                }
+            }
         }
         }
-        let nativeObject = try generator.initWithXCT(args.compactMap({ $0.nativeValue }))
-        let object = XCTLRuntimeVariable(rawObject: nativeObject)
-        return object
+        throw XCTLRuntimeError.generateProtocolNotFoundedError(name: name)
     }
     }
     
     
     internal func addLazyStatement(_ stmt: XCTLStatement) {
     internal func addLazyStatement(_ stmt: XCTLStatement) {

+ 1 - 1
XCTreeLang/Runtime/XCTLRuntimeVariable.swift

@@ -7,7 +7,7 @@
 
 
 import Foundation
 import Foundation
 
 
-public class XCTLRuntimeVariable {
+public class XCTLRuntimeVariable: NSObject {
     
     
     public var type: XCTLRuntimeVariableType
     public var type: XCTLRuntimeVariableType
     public var rawValue: String
     public var rawValue: String

+ 10 - 2
XCTreeLang/Statements/XCTLForStatement.swift

@@ -55,8 +55,16 @@ public class XCTLForStatement: XCTLStatement {
         if enumeratorVariable.type != .typeObject {
         if enumeratorVariable.type != .typeObject {
             throw XCTLRuntimeError.unexpectedVariableType(expect: XCTLRuntimeVariableType.typeObject.rawValue, butGot: enumeratorVariable.type.rawValue)
             throw XCTLRuntimeError.unexpectedVariableType(expect: XCTLRuntimeVariableType.typeObject.rawValue, butGot: enumeratorVariable.type.rawValue)
         }
         }
-        guard let enumerator = enumeratorVariable.objectValue as? XCTLEnumerator else {
-            throw XCTLRuntimeError.variableNotImplementProtocol(protocolName: "XCTLEnumerator")
+        
+        var enumerator: XCTLEnumerator!
+        if let enumeratorImpl = enumeratorVariable.objectValue as? XCTLEnumerator {
+            enumerator = enumeratorImpl
+        }
+        if let enumeratorProvider = enumeratorVariable.objectValue as? XCTLEnumeratorProvider {
+            enumerator = enumeratorProvider.provideEnumerator()
+        }
+        if enumerator == nil {
+            throw XCTLRuntimeError.variableNotImplementProtocol(protocolName: "XCTLEnumerator or XCTLEnumeratorProvider")
         }
         }
         
         
         let context = context.makeSubContext()
         let context = context.makeSubContext()

+ 29 - 14
XCTreeLang/Statements/XCTLVariableRefStatement.swift

@@ -10,6 +10,8 @@ import XCTLRuntimeTypeInstanceModule
 
 
 internal class XCTLVariableRefStatement: XCTLStatement, XCTLBackableStatement, XCTLExpressionPart {
 internal class XCTLVariableRefStatement: XCTLStatement, XCTLBackableStatement, XCTLExpressionPart {
     
     
+    internal static let ignorePropertiesClass = [NSArray.self, NSDictionary.self]
+    
     var type: XCTLStatementType { .typeVariableRef }
     var type: XCTLStatementType { .typeVariableRef }
     
     
     var expressionValue: XCTLExpressionValue { .product }
     var expressionValue: XCTLExpressionValue { .product }
@@ -65,26 +67,39 @@ internal class XCTLVariableRefStatement: XCTLStatement, XCTLBackableStatement, X
             let exception = ocTryCatch {
             let exception = ocTryCatch {
                 obj = rawObject.value(forKey: memberName)
                 obj = rawObject.value(forKey: memberName)
             }
             }
-            if exception != nil {
+            if exception != nil || Self.ignorePropertiesClass.contains(where: { rawObject.isKind(of: $0) }) {
                 if nextStmt.nextVariableRefStmt == nil {
                 if nextStmt.nextVariableRefStmt == nil {
+                    if let array = rawObject as? NSArray {
+                        switch memberName {
+                        case "count":
+                            let returnValue = XCTLRuntimeVariable(type: .typeNumber, rawValue: array.count.description)
+                            context.variableStack.pushVariable(returnValue)
+                            return returnValue
+                        default:
+                            break
+                        }
+                    }
                     let selector = NSSelectorFromString(memberName)
                     let selector = NSSelectorFromString(memberName)
                     if rawObject.responds(to: selector) {
                     if rawObject.responds(to: selector) {
                         let funcIntrinsicVariable = XCTLRuntimeVariable { args in
                         let funcIntrinsicVariable = XCTLRuntimeVariable { args in
-                            let invocation = try Invocation(target: rawObject, selector: selector)
-                            for index in 0..<invocation.numberOfArguments - 2 {
-                                let arg = args[index]
-                                if arg.type == .typeNumber {
-                                    invocation.setArgument(arg.doubleValue, at: index + 2)
-                                } else {
-                                    invocation.setArgument(arg.nativeValue, at: index + 2)
-                                }
+                            let invocation = XCTLSwiftInvocation(target: rawObject, selector: selector)
+                            let value = try invocation.invokeMemberFunc(params: args.map({ $0.nativeValue }))
+                            if value is NSNull {
+                                return .void
+                            }
+                            if let value = value as? String {
+                                return XCTLRuntimeVariable(type: .typeString, rawValue: value)
+                            }
+                            if let value = value as? Double {
+                                return XCTLRuntimeVariable(type: .typeNumber, rawValue: value.description)
+                            }
+                            if let value = value as? Bool {
+                                return XCTLRuntimeVariable(type: .typeBoolean, rawValue: value.description)
                             }
                             }
-                            invocation.invoke()
-                            if invocation.returnsObject,
-                               let object = invocation.returnedObject as? NSObject {
-                                return XCTLRuntimeVariable(rawObject: object)
+                            if let value = value as? NSObject {
+                                return XCTLRuntimeVariable(rawObject: value)
                             }
                             }
-                            return .void
+                            throw XCTLRuntimeError.callingTypeEncodingError
                         }
                         }
                         context.variableStack.pushVariable(funcIntrinsicVariable)
                         context.variableStack.pushVariable(funcIntrinsicVariable)
                         return funcIntrinsicVariable
                         return funcIntrinsicVariable

+ 3 - 0
XCTreeLang/XCTLRuntimeError.swift

@@ -30,5 +30,8 @@ public enum XCTLRuntimeError: Error {
     case variableStackNoObject
     case variableStackNoObject
     case variableStackNotEmptyAfterTerminator
     case variableStackNotEmptyAfterTerminator
     
     
+    case unknownTypeEncoding(name: String)
+    case callingTypeEncodingError
+    
 }
 }