4
4
*
5
5
* GPU Accelerated JavaScript
6
6
*
7
- * @version 2.0.0-rc.23
8
- * @date Fri Jul 26 2019 14:52:24 GMT-0400 (Eastern Daylight Time)
7
+ * @version 2.0.0-rc.24
8
+ * @date Mon Jul 29 2019 16:04:14 GMT-0400 (Eastern Daylight Time)
9
9
*
10
10
* @license MIT
11
11
* The MIT License
@@ -2776,6 +2776,18 @@ class FunctionNode {
2776
2776
return 'Integer' ;
2777
2777
}
2778
2778
const type = this . getType ( ast . left ) ;
2779
+ if ( this . isState ( 'skip-literal-correction' ) ) return type ;
2780
+ if ( type === 'LiteralInteger' ) {
2781
+ const rightType = this . getType ( ast . right ) ;
2782
+ if ( rightType === 'LiteralInteger' ) {
2783
+ if ( ast . left . value % 1 === 0 ) {
2784
+ return 'Integer' ;
2785
+ } else {
2786
+ return 'Float' ;
2787
+ }
2788
+ }
2789
+ return rightType ;
2790
+ }
2779
2791
return typeLookupMap [ type ] || type ;
2780
2792
case 'UpdateExpression' :
2781
2793
return this . getType ( ast . argument ) ;
@@ -6529,7 +6541,9 @@ class WebGLFunctionNode extends FunctionNode {
6529
6541
6530
6542
astReturnStatement ( ast , retArr ) {
6531
6543
if ( ! ast . argument ) throw this . astErrorOutput ( 'Unexpected return statement' , ast ) ;
6544
+ this . pushState ( 'skip-literal-correction' ) ;
6532
6545
const type = this . getType ( ast . argument ) ;
6546
+ this . popState ( 'skip-literal-correction' ) ;
6533
6547
6534
6548
const result = [ ] ;
6535
6549
@@ -6606,22 +6620,23 @@ class WebGLFunctionNode extends FunctionNode {
6606
6620
) ;
6607
6621
}
6608
6622
6623
+ const key = `${ ast . start } ,${ ast . end } ` ;
6609
6624
if ( Number . isInteger ( ast . value ) ) {
6610
- if ( this . isState ( 'in-for-loop-init' ) || this . isState ( 'casting-to-integer' ) ) {
6611
- this . literalTypes [ ` ${ ast . start } , ${ ast . end } ` ] = 'Integer' ;
6625
+ if ( this . isState ( 'in-for-loop-init' ) || this . isState ( 'casting-to-integer' ) || this . isState ( 'building-integer' ) ) {
6626
+ this . literalTypes [ key ] = 'Integer' ;
6612
6627
retArr . push ( `${ ast . value } ` ) ;
6613
- } else if ( this . isState ( 'casting-to-float' ) ) {
6614
- this . literalTypes [ ` ${ ast . start } , ${ ast . end } ` ] = 'Number' ;
6628
+ } else if ( this . isState ( 'casting-to-float' ) || this . isState ( 'building-float' ) ) {
6629
+ this . literalTypes [ key ] = 'Number' ;
6615
6630
retArr . push ( `${ ast . value } .0` ) ;
6616
6631
} else {
6617
- this . literalTypes [ ` ${ ast . start } , ${ ast . end } ` ] = 'Number' ;
6632
+ this . literalTypes [ key ] = 'Number' ;
6618
6633
retArr . push ( `${ ast . value } .0` ) ;
6619
6634
}
6620
- } else if ( this . isState ( 'casting-to-integer' ) ) {
6621
- this . literalTypes [ ` ${ ast . start } , ${ ast . end } ` ] = 'Integer' ;
6622
- retArr . push ( parseInt ( ast . raw ) ) ;
6635
+ } else if ( this . isState ( 'casting-to-integer' ) || this . isState ( 'building-integer' ) ) {
6636
+ this . literalTypes [ key ] = 'Integer' ;
6637
+ retArr . push ( Math . round ( ast . value ) ) ;
6623
6638
} else {
6624
- this . literalTypes [ ` ${ ast . start } , ${ ast . end } ` ] = 'Number' ;
6639
+ this . literalTypes [ key ] = 'Number' ;
6625
6640
retArr . push ( `${ ast . value } ` ) ;
6626
6641
}
6627
6642
return retArr ;
@@ -6634,6 +6649,7 @@ class WebGLFunctionNode extends FunctionNode {
6634
6649
6635
6650
if ( this . fixIntegerDivisionAccuracy && ast . operator === '/' ) {
6636
6651
retArr . push ( 'div_with_int_check(' ) ;
6652
+ this . pushState ( 'building-float' ) ;
6637
6653
switch ( this . getType ( ast . left ) ) {
6638
6654
case 'Integer' :
6639
6655
this . castValueToFloat ( ast . left , retArr ) ;
@@ -6655,6 +6671,7 @@ class WebGLFunctionNode extends FunctionNode {
6655
6671
default :
6656
6672
this . astGeneric ( ast . right , retArr ) ;
6657
6673
}
6674
+ this . popState ( 'building-float' ) ;
6658
6675
retArr . push ( ')' ) ;
6659
6676
return retArr ;
6660
6677
}
@@ -6668,40 +6685,51 @@ class WebGLFunctionNode extends FunctionNode {
6668
6685
const key = leftType + ' & ' + rightType ;
6669
6686
switch ( key ) {
6670
6687
case 'Integer & Integer' :
6688
+ this . pushState ( 'building-integer' ) ;
6671
6689
this . astGeneric ( ast . left , retArr ) ;
6672
6690
retArr . push ( operatorMap [ ast . operator ] || ast . operator ) ;
6673
6691
this . astGeneric ( ast . right , retArr ) ;
6692
+ this . popState ( 'building-integer' ) ;
6674
6693
break ;
6675
6694
case 'Number & Float' :
6676
6695
case 'Float & Number' :
6677
6696
case 'Float & Float' :
6678
6697
case 'Number & Number' :
6698
+ this . pushState ( 'building-float' ) ;
6679
6699
this . astGeneric ( ast . left , retArr ) ;
6680
6700
retArr . push ( operatorMap [ ast . operator ] || ast . operator ) ;
6681
6701
this . astGeneric ( ast . right , retArr ) ;
6702
+ this . popState ( 'building-float' ) ;
6682
6703
break ;
6683
6704
case 'LiteralInteger & LiteralInteger' :
6684
- if ( this . isState ( 'casting-to-integer' ) ) {
6705
+ if ( this . isState ( 'casting-to-integer' ) || this . isState ( 'building-integer' ) ) {
6706
+ this . pushState ( 'building-integer' ) ;
6685
6707
this . astGeneric ( ast . left , retArr ) ;
6686
6708
retArr . push ( operatorMap [ ast . operator ] || ast . operator ) ;
6687
6709
this . astGeneric ( ast . right , retArr ) ;
6710
+ this . popState ( 'building-integer' ) ;
6688
6711
} else {
6712
+ this . pushState ( 'building-float' ) ;
6689
6713
this . castLiteralToFloat ( ast . left , retArr ) ;
6690
6714
retArr . push ( operatorMap [ ast . operator ] || ast . operator ) ;
6691
6715
this . castLiteralToFloat ( ast . right , retArr ) ;
6716
+ this . popState ( 'building-float' ) ;
6692
6717
}
6693
6718
break ;
6694
6719
6695
6720
case 'Integer & Float' :
6696
6721
case 'Integer & Number' :
6697
6722
if ( ast . operator === '>' || ast . operator === '<' && ast . right . type === 'Literal' ) {
6698
6723
if ( ! Number . isInteger ( ast . right . value ) ) {
6724
+ this . pushState ( 'building-float' ) ;
6699
6725
this . castValueToFloat ( ast . left , retArr ) ;
6700
6726
retArr . push ( operatorMap [ ast . operator ] || ast . operator ) ;
6701
6727
this . astGeneric ( ast . right , retArr ) ;
6728
+ this . popState ( 'building-float' ) ;
6702
6729
break ;
6703
6730
}
6704
6731
}
6732
+ this . pushState ( 'building-integer' ) ;
6705
6733
this . astGeneric ( ast . left , retArr ) ;
6706
6734
retArr . push ( operatorMap [ ast . operator ] || ast . operator ) ;
6707
6735
this . pushState ( 'casting-to-integer' ) ;
@@ -6720,62 +6748,81 @@ class WebGLFunctionNode extends FunctionNode {
6720
6748
retArr . push ( ')' ) ;
6721
6749
}
6722
6750
this . popState ( 'casting-to-integer' ) ;
6751
+ this . popState ( 'building-integer' ) ;
6723
6752
break ;
6724
6753
case 'Integer & LiteralInteger' :
6754
+ this . pushState ( 'building-integer' ) ;
6725
6755
this . astGeneric ( ast . left , retArr ) ;
6726
6756
retArr . push ( operatorMap [ ast . operator ] || ast . operator ) ;
6727
6757
this . castLiteralToInteger ( ast . right , retArr ) ;
6758
+ this . popState ( 'building-integer' ) ;
6728
6759
break ;
6729
6760
6730
6761
case 'Number & Integer' :
6762
+ this . pushState ( 'building-float' ) ;
6731
6763
this . astGeneric ( ast . left , retArr ) ;
6732
6764
retArr . push ( operatorMap [ ast . operator ] || ast . operator ) ;
6733
6765
this . castValueToFloat ( ast . right , retArr ) ;
6766
+ this . popState ( 'building-float' ) ;
6734
6767
break ;
6735
6768
case 'Float & LiteralInteger' :
6736
6769
case 'Number & LiteralInteger' :
6737
6770
if ( this . isState ( 'in-for-loop-test' ) ) {
6771
+ this . pushState ( 'building-integer' ) ;
6738
6772
retArr . push ( 'int(' ) ;
6739
6773
this . astGeneric ( ast . left , retArr ) ;
6740
6774
retArr . push ( ')' ) ;
6741
6775
retArr . push ( operatorMap [ ast . operator ] || ast . operator ) ;
6742
6776
this . castLiteralToInteger ( ast . right , retArr ) ;
6777
+ this . popState ( 'building-integer' ) ;
6743
6778
} else {
6779
+ this . pushState ( 'building-float' ) ;
6744
6780
this . astGeneric ( ast . left , retArr ) ;
6745
6781
retArr . push ( operatorMap [ ast . operator ] || ast . operator ) ;
6746
6782
this . castLiteralToFloat ( ast . right , retArr ) ;
6783
+ this . popState ( 'building-float' ) ;
6747
6784
}
6748
6785
break ;
6749
6786
case 'LiteralInteger & Float' :
6750
6787
case 'LiteralInteger & Number' :
6751
6788
if ( this . isState ( 'in-for-loop-test' ) || this . isState ( 'in-for-loop-init' ) || this . isState ( 'casting-to-integer' ) ) {
6789
+ this . pushState ( 'building-integer' ) ;
6752
6790
this . castLiteralToInteger ( ast . left , retArr ) ;
6753
6791
retArr . push ( operatorMap [ ast . operator ] || ast . operator ) ;
6754
6792
this . castValueToInteger ( ast . right , retArr ) ;
6793
+ this . popState ( 'building-integer' ) ;
6755
6794
} else {
6795
+ this . pushState ( 'building-float' ) ;
6756
6796
this . astGeneric ( ast . left , retArr ) ;
6757
6797
retArr . push ( operatorMap [ ast . operator ] || ast . operator ) ;
6758
6798
this . pushState ( 'casting-to-float' ) ;
6759
6799
this . astGeneric ( ast . right , retArr ) ;
6760
6800
this . popState ( 'casting-to-float' ) ;
6801
+ this . popState ( 'building-float' ) ;
6761
6802
}
6762
6803
break ;
6763
6804
case 'LiteralInteger & Integer' :
6805
+ this . pushState ( 'building-integer' ) ;
6764
6806
this . castLiteralToInteger ( ast . left , retArr ) ;
6765
6807
retArr . push ( operatorMap [ ast . operator ] || ast . operator ) ;
6766
6808
this . astGeneric ( ast . right , retArr ) ;
6809
+ this . popState ( 'building-integer' ) ;
6767
6810
break ;
6768
6811
6769
6812
case 'Boolean & Boolean' :
6813
+ this . pushState ( 'building-boolean' ) ;
6770
6814
this . astGeneric ( ast . left , retArr ) ;
6771
6815
retArr . push ( operatorMap [ ast . operator ] || ast . operator ) ;
6772
6816
this . astGeneric ( ast . right , retArr ) ;
6817
+ this . popState ( 'building-boolean' ) ;
6773
6818
break ;
6774
6819
6775
6820
case 'Float & Integer' :
6821
+ this . pushState ( 'building-float' ) ;
6776
6822
this . astGeneric ( ast . left , retArr ) ;
6777
6823
retArr . push ( operatorMap [ ast . operator ] || ast . operator ) ;
6778
6824
this . castValueToFloat ( ast . right , retArr ) ;
6825
+ this . popState ( 'building-float' ) ;
6779
6826
break ;
6780
6827
6781
6828
default :
@@ -7165,9 +7212,13 @@ class WebGLFunctionNode extends FunctionNode {
7165
7212
lastType = type ;
7166
7213
declarationResult . push ( `user_${ declaration . id . name } =` ) ;
7167
7214
if ( actualType === 'Number' && type === 'Integer' ) {
7168
- declarationResult . push ( 'int(' ) ;
7169
- this . astGeneric ( init , declarationResult ) ;
7170
- declarationResult . push ( ')' ) ;
7215
+ if ( init . left && init . left . type === 'Literal' ) {
7216
+ this . astGeneric ( init , declarationResult ) ;
7217
+ } else {
7218
+ declarationResult . push ( 'int(' ) ;
7219
+ this . astGeneric ( init , declarationResult ) ;
7220
+ declarationResult . push ( ')' ) ;
7221
+ }
7171
7222
} else {
7172
7223
this . astGeneric ( init , declarationResult ) ;
7173
7224
}
@@ -13743,6 +13794,5 @@ const _systemEndianness = utils.getSystemEndianness();
13743
13794
module . exports = {
13744
13795
utils
13745
13796
} ;
13746
-
13747
13797
} , { "./gpu.js" :101 , "./input" :103 , "./texture" :106 , "acorn" :1 } ] } , { } , [ 100 ] ) ( 100 )
13748
13798
} ) ;
0 commit comments