[Laszlo-checkins] r16557 - openlaszlo/trunk/WEB-INF/lps/server/src/org/openlaszlo/sc

bargull@openlaszlo.org bargull at openlaszlo.org
Tue Jun 1 10:28:44 PDT 2010


Author: bargull
Date: 2010-06-01 10:28:41 -0700 (Tue, 01 Jun 2010)
New Revision: 16557

Modified:
   openlaszlo/trunk/WEB-INF/lps/server/src/org/openlaszlo/sc/CodeGenerator.java
   openlaszlo/trunk/WEB-INF/lps/server/src/org/openlaszlo/sc/JavascriptGenerator.java
Log:
Change 20100531-bargull-DuF by bargull at Bargull02 on 2010-05-31 11:57:14
    in /home/anba/src/svn/openlaszlo/trunk
    for http://svn.openlaszlo.org/openlaszlo/trunk

Summary: enable compile-time evaluation of conditional expressions

New Features: LPP-9030 (Compiler should short-circuit conditional expressions on compile-time constants)

Bugs Fixed:

Technical Reviewer: ptw
QA Reviewer: (pending)
Doc Reviewer: (pending)

Documentation:

Release Notes:

Overview:
    

Details:
Override visitConditionalExpression() in CodeGenerator and JavascriptGenerator just like it's already done for visitIfStatement().
    

Tests:
smokecheck swf8,swf10,dhtml
inspection of disassembled swf8-file, intermediate swf10-file, generated js-file



Modified: openlaszlo/trunk/WEB-INF/lps/server/src/org/openlaszlo/sc/CodeGenerator.java
===================================================================
--- openlaszlo/trunk/WEB-INF/lps/server/src/org/openlaszlo/sc/CodeGenerator.java	2010-06-01 17:26:40 UTC (rev 16556)
+++ openlaszlo/trunk/WEB-INF/lps/server/src/org/openlaszlo/sc/CodeGenerator.java	2010-06-01 17:28:41 UTC (rev 16557)
@@ -1851,16 +1851,27 @@
     SimpleNode test = children[0];
     SimpleNode a = children[1];
     SimpleNode b = children[2];
-    String l1 = newLabel(node);
-    String l2 = newLabel(node);
-    visitExpression(test);
-    collector.emit(Instructions.BranchIfTrue.make(l1));
-    visitExpression(b);
-    collector.emit(Instructions.BRANCH.make(l2));
-    collector.emit(Instructions.LABEL.make(l1));
-    visitExpression(a);
-    collector.emit(Instructions.LABEL.make(l2));
-    return node;
+
+    // Compile-time conditional evaluations
+    Boolean value = evaluateCompileTimeConditional(test);
+    if (value != null) {
+      if (value.booleanValue()) {
+        return visitExpression(a);
+      } else {
+        return visitExpression(b);
+      }
+    } else {
+      String l1 = newLabel(node);
+      String l2 = newLabel(node);
+      visitExpression(test);
+      collector.emit(Instructions.BranchIfTrue.make(l1));
+      visitExpression(b);
+      collector.emit(Instructions.BRANCH.make(l2));
+      collector.emit(Instructions.LABEL.make(l1));
+      visitExpression(a);
+      collector.emit(Instructions.LABEL.make(l2));
+      return node;
+    }
   }
 
   public SimpleNode visitAssignmentExpression(SimpleNode node, boolean isReferenced, SimpleNode[] children) {

Modified: openlaszlo/trunk/WEB-INF/lps/server/src/org/openlaszlo/sc/JavascriptGenerator.java
===================================================================
--- openlaszlo/trunk/WEB-INF/lps/server/src/org/openlaszlo/sc/JavascriptGenerator.java	2010-06-01 17:26:40 UTC (rev 16556)
+++ openlaszlo/trunk/WEB-INF/lps/server/src/org/openlaszlo/sc/JavascriptGenerator.java	2010-06-01 17:28:41 UTC (rev 16557)
@@ -934,6 +934,28 @@
     return node;
   }
 
+  public SimpleNode visitConditionalExpression(SimpleNode node, boolean isReferenced, SimpleNode[] children) {
+    assert children.length == 3;
+    SimpleNode test = children[0];
+    SimpleNode a = children[1];
+    SimpleNode b = children[2];
+
+    // Compile-time conditional evaluations
+    Boolean value = evaluateCompileTimeConditional(test);
+    if (value != null) {
+      if (value.booleanValue()) {
+        return visitExpression(a);
+      } else {
+        return visitExpression(b);
+      }
+    } else {
+      children[0] = visitExpression(test);
+      children[1] = visitExpression(a);
+      children[2] = visitExpression(b);
+      return node;
+    }
+  }
+
   public SimpleNode visitAssignmentExpression(SimpleNode node, boolean isReferenced, SimpleNode[] children) {
     JavascriptReference lhs = translateReference(children[0]);
     int op = ((ASTOperator)children[1]).getOperator();



More information about the Laszlo-checkins mailing list