@@ -862,13 +862,22 @@ class Program implements TopOpWriter {
862862 }
863863 }
864864
865+ private valueIsAlwaysFalse ( v : Value ) {
866+ if ( v . isLiteral ) return v . numValue == 0
867+ return v . op == Op . EXPR0_FALSE || v . op == Op . EXPR0_NULL
868+ }
869+
870+ private valueIsAlwaysTrue ( v : Value ) {
871+ if ( v . isLiteral ) return v . numValue != 0 && ! isNaN ( v . numValue )
872+ return v . op == Op . EXPR0_TRUE
873+ }
874+
865875 private emitIfStatement ( stmt : ts . IfStatement ) {
866876 const cond = this . emitSimpleValue ( stmt . expression , ValueType . BOOL )
867- if ( cond . isLiteral ) {
868- if ( cond . numValue ) this . emitStmt ( stmt . thenStatement )
869- else {
870- if ( stmt . elseStatement ) this . emitStmt ( stmt . elseStatement )
871- }
877+ if ( this . valueIsAlwaysFalse ( cond ) ) {
878+ if ( stmt . elseStatement ) this . emitStmt ( stmt . elseStatement )
879+ } else if ( this . valueIsAlwaysTrue ( cond ) ) {
880+ this . emitStmt ( stmt . thenStatement )
872881 } else {
873882 this . writer . emitIfAndPop (
874883 cond ,
@@ -2489,15 +2498,16 @@ class Program implements TopOpWriter {
24892498 }
24902499
24912500 private emitLiteral ( v : any , node ?: ts . Node ) {
2492- if ( v === true ) v = 1
2493- else if ( v === false ) v = 0
2494-
2495- if ( v === null || v === undefined ) return literal ( v )
2501+ if (
2502+ v === null ||
2503+ v === undefined ||
2504+ typeof v == "number" ||
2505+ typeof v == "boolean"
2506+ )
2507+ return literal ( v )
24962508
24972509 if ( typeof v == "string" ) return this . writer . emitString ( v )
24982510
2499- if ( typeof v == "number" ) return literal ( v )
2500-
25012511 throwError ( node , "unhandled literal: " + v )
25022512 }
25032513
@@ -2792,7 +2802,11 @@ class Program implements TopOpWriter {
27922802 let a = this . emitSimpleValue ( expr . left , dstTp )
27932803 let b = this . emitSimpleValue ( expr . right , dstTp )
27942804 if ( swap ) [ a , b ] = [ b , a ]
2795- return wr . emitExpr ( op2 , a , b )
2805+
2806+ const res = wr . emitExpr ( op2 , a , b )
2807+ if ( op2 == Op . EXPR2_ADD && this . isStringLike ( expr ) )
2808+ res . valueType = ValueType . STRING
2809+ return res
27962810 }
27972811
27982812 private emitUnaryExpression ( expr : ts . PrefixUnaryExpression ) : Value {
0 commit comments