Author: Stephan <[email protected]>
Branch:
Changeset: r62:0e61f2a8c76a
Date: 2011-05-17 18:44 +0200
http://bitbucket.org/pypy/lang-js/changeset/0e61f2a8c76a/
Log: allow switch without default
diff --git a/js/astbuilder.py b/js/astbuilder.py
--- a/js/astbuilder.py
+++ b/js/astbuilder.py
@@ -391,7 +391,10 @@
def visit_caseblock(self, node):
pos = self.get_pos(node)
caseclauses = self.dispatch(node.children[0])
- defaultblock = self.dispatch(node.children[1])
+ if len(node.children) > 1:
+ defaultblock = self.dispatch(node.children[1])
+ else:
+ defaultblock = None
return operations.Cases(pos, caseclauses, defaultblock)
def visit_caseclauses(self, node):
diff --git a/js/operations.py b/js/operations.py
--- a/js/operations.py
+++ b/js/operations.py
@@ -384,7 +384,10 @@
clause.block.emit(bytecode)
bytecode.emit('JUMP', end_of_switch)
bytecode.emit('LABEL', next_clause)
- self.default_clause.emit(bytecode)
+ if self.default_clause is not None:
+ self.default_clause.emit(bytecode)
+ else:
+ bytecode.unpop_or_undefined()
bytecode.emit('LABEL', end_of_switch)
bytecode.emit('POP')
diff --git a/js/test/test_interp.py b/js/test/test_interp.py
--- a/js/test/test_interp.py
+++ b/js/test/test_interp.py
@@ -695,3 +695,21 @@
yield assertv, switch_test_code(1), 1
yield assertv, switch_test_code(2), 2
yield assertv, switch_test_code(3), 42
+
+def switch_no_default_test_code(x):
+ return """
+ function f(x) {
+ switch(x) {
+ case 1:
+ return 2;
+ break;
+ }
+ return 42;
+ };
+
+ f(%(x)s);
+ """ % {'x': x}
+
+def test_switch_no_default():
+ yield assertv, switch_no_default_test_code(0), 42
+ yield assertv, switch_no_default_test_code(1), 2
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit