Skip to content

Commit

Permalink
Set default output for function declarations in ASM
Browse files Browse the repository at this point in the history
  • Loading branch information
jbeers committed Mar 2, 2025
1 parent d2103c8 commit 14be4cc
Showing 1 changed file with 19 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@

import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;

import org.objectweb.asm.Opcodes;
Expand All @@ -24,19 +25,25 @@
import org.objectweb.asm.tree.ClassNode;
import org.objectweb.asm.tree.FieldInsnNode;
import org.objectweb.asm.tree.InsnNode;
import org.objectweb.asm.tree.LdcInsnNode;
import org.objectweb.asm.tree.MethodInsnNode;

import ortus.boxlang.compiler.asmboxpiler.AsmHelper;
import ortus.boxlang.compiler.asmboxpiler.AsmTranspiler;
import ortus.boxlang.compiler.asmboxpiler.transformer.AbstractTransformer;
import ortus.boxlang.compiler.asmboxpiler.transformer.ReturnValueContext;
import ortus.boxlang.compiler.asmboxpiler.transformer.TransformerContext;
import ortus.boxlang.compiler.ast.BoxExpression;
import ortus.boxlang.compiler.ast.BoxNode;
import ortus.boxlang.compiler.ast.BoxScript;
import ortus.boxlang.compiler.ast.BoxTemplate;
import ortus.boxlang.compiler.ast.statement.BoxAccessModifier;
import ortus.boxlang.compiler.ast.statement.BoxFunctionDeclaration;
import ortus.boxlang.compiler.ast.statement.BoxMethodDeclarationModifier;
import ortus.boxlang.compiler.ast.statement.BoxReturnType;
import ortus.boxlang.compiler.ast.statement.BoxScriptIsland;
import ortus.boxlang.compiler.ast.statement.BoxType;
import ortus.boxlang.compiler.ast.statement.component.BoxTemplateIsland;
import ortus.boxlang.compiler.parser.BoxSourceType;
import ortus.boxlang.runtime.context.FunctionBoxContext;
import ortus.boxlang.runtime.context.IBoxContext;
Expand Down Expand Up @@ -245,11 +252,12 @@ public List<AbstractInsnNode> transform( BoxNode node, TransformerContext contex
List<AbstractInsnNode> nodes = new ArrayList<>();

nodes.addAll( transpiler.getCurrentMethodContextTracker().get().loadCurrentContext() );
nodes.add( new LdcInsnNode( shouldDefaultOutput( function ) ? 1 : 0 ) );
nodes.add(
new MethodInsnNode( Opcodes.INVOKESTATIC,
type.getInternalName(),
"getInstance",
Type.getMethodDescriptor( type ),
Type.getMethodDescriptor( type, Type.BOOLEAN_TYPE ),
false )
);
nodes.add(
Expand All @@ -274,4 +282,14 @@ public List<AbstractInsnNode> transform( BoxNode node, TransformerContext contex
return new ArrayList<>();
}
}

private boolean shouldDefaultOutput( BoxFunctionDeclaration function ) {
// If the closest ancestor is a script, then the default output is true
@SuppressWarnings( "unchecked" )
BoxNode ancestor = function.getFirstNodeOfTypes( BoxTemplate.class, BoxScript.class, BoxExpression.class, BoxScriptIsland.class,
BoxTemplateIsland.class );
boolean defaultOutput = ancestor == null || !Set.of( BoxTemplate.class, BoxTemplateIsland.class ).contains( ancestor.getClass() );

return defaultOutput;
}
}

0 comments on commit 14be4cc

Please # to comment.