@@ -181,11 +181,11 @@ const codeGenerators: { [type: string]: (node: Node, cg: CodeGenerator) => Compi
181181 cg . symbolTable . extend ( )
182182 let maxStack = 0
183183 let resultType = ''
184- ; ( node as Block ) . blockStatements . forEach ( x => {
185- const { stackSize : stackSize , resultType : type } = compile ( x , cg )
186- maxStack = Math . max ( maxStack , stackSize )
187- resultType = type
188- } )
184+ ; ( node as Block ) . blockStatements . forEach ( x => {
185+ const { stackSize : stackSize , resultType : type } = compile ( x , cg )
186+ maxStack = Math . max ( maxStack , stackSize )
187+ resultType = type
188+ } )
189189 cg . symbolTable . teardown ( )
190190
191191 return { stackSize : maxStack , resultType }
@@ -418,8 +418,10 @@ const codeGenerators: { [type: string]: (node: Node, cg: CodeGenerator) => Compi
418418 literalType : { kind : kind , value : value }
419419 } = node
420420 const boolValue = value === 'true'
421- if ( kind === 'BooleanLiteral' && onTrue === boolValue ) {
422- cg . addBranchInstr ( OPCODE . GOTO , targetLabel )
421+ if ( kind === 'BooleanLiteral' ) {
422+ if ( onTrue === boolValue ) {
423+ cg . addBranchInstr ( OPCODE . GOTO , targetLabel )
424+ }
423425 return { stackSize : 0 , resultType : cg . symbolTable . generateFieldDescriptor ( 'boolean' ) }
424426 }
425427 }
@@ -470,20 +472,20 @@ const codeGenerators: { [type: string]: (node: Node, cg: CodeGenerator) => Compi
470472 } else if ( op in reverseLogicalOp ) {
471473 if ( isNullLiteral ( left ) ) {
472474 // still use l to represent the first argument pushed onto stack
473- l = f ( right , targetLabel , onTrue )
475+ l = compile ( right , cg )
474476 cg . addBranchInstr (
475477 onTrue !== ( op === '!=' ) ? OPCODE . IFNULL : OPCODE . IFNONNULL ,
476478 targetLabel
477479 )
478480 } else if ( isNullLiteral ( right ) ) {
479- l = f ( left , targetLabel , onTrue )
481+ l = compile ( left , cg )
480482 cg . addBranchInstr (
481483 onTrue !== ( op === '!=' ) ? OPCODE . IFNULL : OPCODE . IFNONNULL ,
482484 targetLabel
483485 )
484486 } else {
485- l = f ( left , targetLabel , onTrue )
486- r = f ( right , targetLabel , onTrue )
487+ l = compile ( left , cg )
488+ r = compile ( right , cg )
487489 cg . addBranchInstr ( onTrue ? logicalOp [ op ] : reverseLogicalOp [ op ] , targetLabel )
488490 }
489491 return {
@@ -496,7 +498,9 @@ const codeGenerators: { [type: string]: (node: Node, cg: CodeGenerator) => Compi
496498 }
497499 }
498500
499- return compile ( node , cg )
501+ const res = compile ( node , cg )
502+ cg . addBranchInstr ( onTrue ? OPCODE . IFNE : OPCODE . IFEQ , cg . labels [ cg . labels . length - 1 ] )
503+ return res
500504 }
501505 return f ( node , cg . labels [ cg . labels . length - 1 ] , false )
502506 } ,
@@ -799,9 +803,10 @@ const codeGenerators: { [type: string]: (node: Node, cg: CodeGenerator) => Compi
799803 field
800804 )
801805 }
806+ const fetchedFieldTypeDescriptor = ( fieldInfos [ fieldInfos . length - 1 ] as FieldInfo ) . typeDescriptor
802807 return {
803- stackSize : 1 ,
804- resultType : ( fieldInfos [ fieldInfos . length - 1 ] as FieldInfo ) . typeDescriptor
808+ stackSize : 1 + ( [ 'D' , 'J' ] . includes ( fetchedFieldTypeDescriptor ) ? 1 : 0 ) ,
809+ resultType : fetchedFieldTypeDescriptor
805810 }
806811 } else {
807812 cg . code . push (
@@ -917,14 +922,19 @@ class CodeGenerator {
917922 }
918923
919924 methodNode . methodHeader . formalParameterList . forEach ( p => {
920- this . symbolTable . insertVariableInfo ( {
925+ const paramInfo = {
921926 name : p . identifier ,
922927 accessFlags : 0 ,
923928 index : this . maxLocals ,
924929 typeName : p . unannType ,
925930 typeDescriptor : this . symbolTable . generateFieldDescriptor ( p . unannType )
926- } )
927- this . maxLocals ++
931+ }
932+ this . symbolTable . insertVariableInfo ( paramInfo )
933+ if ( [ 'D' , 'J' ] . includes ( paramInfo . typeDescriptor ) ) {
934+ this . maxLocals += 2
935+ } else {
936+ this . maxLocals ++
937+ }
928938 } )
929939
930940 if ( methodNode . methodHeader . identifier === '<init>' ) {
0 commit comments