[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