فهرست منبع

optimize unnecessary array/map cloning

Vladislav Folts 9 سال پیش
والد
کامیت
89dfb59ee2

BIN
bin/compiled.zip


+ 7 - 3
src/eberon/EberonContextInPlace.ob

@@ -52,9 +52,13 @@ BEGIN
                 SELF.code := SELF.code + l.rtl.clone(e.code(), l.types.typeInfo(type), "undefined");
                 SELF.code := SELF.code + l.rtl.clone(e.code(), l.types.typeInfo(type), "undefined");
             END;
             END;
         ELSE
         ELSE
-            l <- SELF.root().language();
-            void <- l.types.implicitCast(type, type, FALSE, cloneOp);
-            SELF.code := SELF.code + cloneOp.clone(ContextHierarchy.makeLanguageContext(SELF(POINTER)), e);
+            IF Expression.isTemporary(e^) & (type IS Types.PArray) THEN
+                SELF.code := SELF.code + e.code();
+            ELSE
+                l <- SELF.root().language();
+                void <- l.types.implicitCast(type, type, FALSE, cloneOp);
+                SELF.code := SELF.code + cloneOp.clone(ContextHierarchy.makeLanguageContext(SELF(POINTER)), e);
+            END;
         END;
         END;
     END;
     END;
 END;
 END;

+ 10 - 0
test/expected/eberon/dynamic_array.js

@@ -60,6 +60,16 @@ function arrayOfArrays(){
 	}
 	}
 	aa.push(f());
 	aa.push(f());
 }
 }
+
+function arrayOfMaps(){
+	var aa = [];
+	
+	function f(){
+		var a = {};
+		return RTL$.clone(a, {map: null}, undefined);
+	}
+	aa.push(f());
+}
 dynamicInt.push(3);
 dynamicInt.push(3);
 dynamicInt.push(i);
 dynamicInt.push(i);
 dynamicInt.push(byte);
 dynamicInt.push(byte);

+ 18 - 0
test/expected/eberon/in_place_variables.js

@@ -31,6 +31,24 @@ function varArgs(r/*VAR Derived*/, i/*VAR INTEGER*/, a/*ARRAY 10 OF INTEGER*/){
 	var v2 = i.get();
 	var v2 = i.get();
 	var v3 = a.slice();
 	var v3 = a.slice();
 }
 }
+
+function optimizeTempArray(){
+	
+	function returnA(){
+		var a = [];
+		return a.slice();
+	}
+	var tempA = returnA();
+}
+
+function optimizeTempMap(){
+	
+	function returnM(){
+		var m = {};
+		return RTL$.clone(m, {map: null}, undefined);
+	}
+	var tempM = returnM();
+}
 var v1 = 0;
 var v1 = 0;
 var v2 = 1.23;
 var v2 = 1.23;
 var v4 = true;
 var v4 = true;

+ 2 - 2
test/expected/eberon/map.js

@@ -144,8 +144,8 @@ function assign(a/*MAP OF INTEGER*/){
 	RTL$.copy(a, v, {map: null});
 	RTL$.copy(a, v, {map: null});
 	var v2 = RTL$.clone(a, {map: null}, undefined);
 	var v2 = RTL$.clone(a, {map: null}, undefined);
 	var v3 = RTL$.clone(v2, {map: null}, undefined);
 	var v3 = RTL$.clone(v2, {map: null}, undefined);
-	var v4 = RTL$.clone(returnLocalMap(), {map: null}, undefined);
-	var v5 = RTL$.clone(returnNonLocalMap(v), {map: null}, undefined);
+	var v4 = returnLocalMap();
+	var v5 = returnNonLocalMap(v);
 }
 }
 
 
 function copyMapOfRecord(){
 function copyMapOfRecord(){

+ 16 - 0
test/input/eberon/dynamic_array.ob

@@ -81,6 +81,22 @@ BEGIN
     aa.add(f());
     aa.add(f());
 END;
 END;
 
 
+PROCEDURE arrayOfMaps();
+TYPE
+    A = MAP OF INTEGER;
+VAR
+    aa: ARRAY * OF A;
+
+    PROCEDURE f(): A;
+    VAR
+        a: A;
+    BEGIN
+        RETURN a;
+    END;
+BEGIN
+    aa.add(f());
+END;
+
 BEGIN
 BEGIN
     dynamicInt.add(3);
     dynamicInt.add(3);
     dynamicInt.add(i);
     dynamicInt.add(i);

+ 29 - 0
test/input/eberon/in_place_variables.ob

@@ -45,6 +45,35 @@ END pCharArray;
 PROCEDURE pString(s: STRING);
 PROCEDURE pString(s: STRING);
 END pString;
 END pString;
 *)
 *)
+
+PROCEDURE optimizeTempArray();
+TYPE
+    A = ARRAY * OF INTEGER;
+
+    PROCEDURE returnA(): A;
+    VAR
+        a: A;
+    BEGIN
+        RETURN a;
+    END returnA;
+BEGIN
+    tempA <- returnA();
+END;
+
+PROCEDURE optimizeTempMap();
+TYPE
+    M = MAP OF INTEGER;
+
+    PROCEDURE returnM(): M;
+    VAR
+        m: M;
+    BEGIN
+        RETURN m;
+    END returnM;
+BEGIN
+    tempM <- returnM();
+END;
+
 BEGIN
 BEGIN
     v1 <- 0;
     v1 <- 0;
     v2 <- 1.23;
     v2 <- 1.23;