for loop optimization
This commit is contained in:
		
							parent
							
								
									148d1b6d24
								
							
						
					
					
						commit
						b331f4edaa
					
				
							
								
								
									
										11
									
								
								happy.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								happy.py
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,11 @@
 | 
			
		||||
count = 0
 | 
			
		||||
for n1 in range(10):
 | 
			
		||||
    for n2 in range(10):
 | 
			
		||||
        for n3 in range(10):
 | 
			
		||||
            for n4 in range(10):
 | 
			
		||||
                for n5 in range(10):
 | 
			
		||||
                    for n6 in range(10):
 | 
			
		||||
                        if n1 + n2 + n3 == n4 + n5 + n6:
 | 
			
		||||
                            count += 1
 | 
			
		||||
 | 
			
		||||
print(count)
 | 
			
		||||
@ -683,7 +683,14 @@ class Compiler(
 | 
			
		||||
                // insofar we suggest source object is enumerable. Later we might need to add checks
 | 
			
		||||
                val sourceObj = source.execute(forContext)
 | 
			
		||||
 | 
			
		||||
                if (sourceObj.isInstanceOf(ObjIterable)) {
 | 
			
		||||
                if (sourceObj is ObjRange && sourceObj.isIntRange) {
 | 
			
		||||
                    loopIntRange(
 | 
			
		||||
                        forContext,
 | 
			
		||||
                        sourceObj.start!!.toInt(),
 | 
			
		||||
                        if (sourceObj.isEndInclusive) sourceObj.end!!.toInt() + 1 else sourceObj.end!!.toInt(),
 | 
			
		||||
                        loopSO, body, elseStatement, label, canBreak
 | 
			
		||||
                    )
 | 
			
		||||
                } else if (sourceObj.isInstanceOf(ObjIterable)) {
 | 
			
		||||
                    loopIterable(forContext, sourceObj, loopSO, body, elseStatement, label, canBreak)
 | 
			
		||||
                } else {
 | 
			
		||||
                    val size = runCatching { sourceObj.invokeInstanceMethod(forContext, "size").toInt() }
 | 
			
		||||
@ -718,8 +725,7 @@ class Compiler(
 | 
			
		||||
                                    } else
 | 
			
		||||
                                        throw lbe
 | 
			
		||||
                                }
 | 
			
		||||
                            }
 | 
			
		||||
                            else result = body.execute(forContext)
 | 
			
		||||
                            } else result = body.execute(forContext)
 | 
			
		||||
                            if (++index >= size) break
 | 
			
		||||
                            current = sourceObj.getAt(forContext, index)
 | 
			
		||||
                        }
 | 
			
		||||
@ -736,6 +742,31 @@ class Compiler(
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private suspend fun loopIntRange(
 | 
			
		||||
        forContext: Context, start: Int, end: Int, loopVar: StoredObj,
 | 
			
		||||
        body: Statement, elseStatement: Statement?, label: String?, catchBreak: Boolean
 | 
			
		||||
    ): Obj {
 | 
			
		||||
        var result: Obj = ObjVoid
 | 
			
		||||
        val iVar = ObjInt(0)
 | 
			
		||||
        loopVar.value = iVar
 | 
			
		||||
        for( i in start ..< end) {
 | 
			
		||||
            iVar.value = i.toLong()
 | 
			
		||||
            if (catchBreak)
 | 
			
		||||
                try {
 | 
			
		||||
                    result = body.execute(forContext)
 | 
			
		||||
                } catch (lbe: LoopBreakContinueException) {
 | 
			
		||||
                    if (lbe.label == label || lbe.label == null) {
 | 
			
		||||
                        if (lbe.doContinue) continue
 | 
			
		||||
                    }
 | 
			
		||||
                    return lbe.result
 | 
			
		||||
                }
 | 
			
		||||
            else {
 | 
			
		||||
                result = body.execute(forContext)
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        return elseStatement?.execute(forContext) ?: result
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private suspend fun loopIterable(
 | 
			
		||||
        forContext: Context, sourceObj: Obj, loopVar: StoredObj,
 | 
			
		||||
        body: Statement, elseStatement: Statement?, label: String?,
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user