Search in sources :

Example 1 with Node

use of st.gravel.support.compiler.ast.Node in project gravel by gravel-st.

the class JVMMethodCompiler method produceMessageSend_.

public JVMMethodCompiler produceMessageSend_(final MessageNode _messageNode) {
    final st.gravel.core.Symbol _selector;
    if (_parent.allowBlockInlining() && (st.gravel.support.jvm.ArrayExtensions.anySatisfy_(_messageNode.arguments(), new st.gravel.support.jvm.Predicate1<Expression>() {

        @Override
        public boolean value_(final Expression _e) {
            return _e.isBlockNode();
        }
    }) && (!st.gravel.support.jvm.ArrayExtensions.anySatisfy_(_messageNode.arguments(), new st.gravel.support.jvm.Predicate1<Expression>() {

        @Override
        public boolean value_(final Expression _e) {
            return _e.isBlockNode() && _e.allNodesContains_(((st.gravel.support.jvm.Block1<Boolean, Node>) (new st.gravel.support.jvm.Block1<Boolean, Node>() {

                @Override
                public Boolean value_(final Node _n) {
                    return (boolean) _n.isSuperNode();
                }
            })));
        }
    })))) {
        return JVMMethodCompiler.this.produceBlockInlineMessageSend_(_messageNode);
    }
    for (final Expression _arg : _messageNode.arguments()) {
        JVMMethodCompiler.this.visit_(_arg);
        JVMMethodCompiler.this.ensureCast_(JVMDynamicObjectType.factory.basicNew());
    }
    _selector = st.gravel.core.Symbol.value(_messageNode.selector());
    this.emit_(DynamicMessageSend.factory.functionName_numArgs_(_parent.selectorConverter().selectorAsFunctionName_(_selector), _selector.numArgs()));
    return this;
}
Also used : ArrayList(java.util.ArrayList) List(java.util.List) TypeCast(st.gravel.support.compiler.ast.TypeCast) Expression(st.gravel.support.compiler.ast.Expression) MessageNode(st.gravel.support.compiler.ast.MessageNode) LocalReadNode(st.gravel.support.compiler.ast.LocalReadNode) ArrayAtPutNode(st.gravel.support.compiler.ast.ArrayAtPutNode) FieldReadNode(st.gravel.support.compiler.ast.FieldReadNode) ReturnNode(st.gravel.support.compiler.ast.ReturnNode) IfTrueIfFalseNode(st.gravel.support.compiler.ast.IfTrueIfFalseNode) HolderDeclarationNode(st.gravel.support.compiler.ast.HolderDeclarationNode) ByteArrayLiteralNode(st.gravel.support.compiler.ast.ByteArrayLiteralNode) DoubleLiteralNode(st.gravel.support.compiler.ast.DoubleLiteralNode) BlockNode(st.gravel.support.compiler.ast.BlockNode) StringLiteralNode(st.gravel.support.compiler.ast.StringLiteralNode) MethodNode(st.gravel.support.compiler.ast.MethodNode) LocalWriteNode(st.gravel.support.compiler.ast.LocalWriteNode) NilLiteralNode(st.gravel.support.compiler.ast.NilLiteralNode) GlobalReadNode(st.gravel.support.compiler.ast.GlobalReadNode) Node(st.gravel.support.compiler.ast.Node) ReferenceLiteralNode(st.gravel.support.compiler.ast.ReferenceLiteralNode) ArraySizeNode(st.gravel.support.compiler.ast.ArraySizeNode) ToDoNode(st.gravel.support.compiler.ast.ToDoNode) FloatLiteralNode(st.gravel.support.compiler.ast.FloatLiteralNode) VariableDeclarationNode(st.gravel.support.compiler.ast.VariableDeclarationNode) SelfNode(st.gravel.support.compiler.ast.SelfNode) CharacterLiteralNode(st.gravel.support.compiler.ast.CharacterLiteralNode) InstanceCreationNode(st.gravel.support.compiler.ast.InstanceCreationNode) CascadeNode(st.gravel.support.compiler.ast.CascadeNode) ArrayAtNode(st.gravel.support.compiler.ast.ArrayAtNode) WhileFalseNode(st.gravel.support.compiler.ast.WhileFalseNode) SymbolLiteralNode(st.gravel.support.compiler.ast.SymbolLiteralNode) WriteHolderNode(st.gravel.support.compiler.ast.WriteHolderNode) BinaryMessageNode(st.gravel.support.compiler.ast.BinaryMessageNode) FieldWriteNode(st.gravel.support.compiler.ast.FieldWriteNode) ReadHolderNode(st.gravel.support.compiler.ast.ReadHolderNode) SuperNode(st.gravel.support.compiler.ast.SuperNode) CreateHolderNode(st.gravel.support.compiler.ast.CreateHolderNode) IsNilNode(st.gravel.support.compiler.ast.IsNilNode) NamespacedVariableNode(st.gravel.support.compiler.ast.NamespacedVariableNode) BooleanAndNode(st.gravel.support.compiler.ast.BooleanAndNode) BooleanOrNode(st.gravel.support.compiler.ast.BooleanOrNode) SequenceNode(st.gravel.support.compiler.ast.SequenceNode) GlobalWriteNode(st.gravel.support.compiler.ast.GlobalWriteNode) IntegerLiteralNode(st.gravel.support.compiler.ast.IntegerLiteralNode) ArrayLiteralNode(st.gravel.support.compiler.ast.ArrayLiteralNode) BooleanLiteralNode(st.gravel.support.compiler.ast.BooleanLiteralNode) IdentityComparisonNode(st.gravel.support.compiler.ast.IdentityComparisonNode) WhileTrueNode(st.gravel.support.compiler.ast.WhileTrueNode) FixedPointLiteralNode(st.gravel.support.compiler.ast.FixedPointLiteralNode) NonLocalReturnNode(st.gravel.support.compiler.ast.NonLocalReturnNode)

Example 2 with Node

use of st.gravel.support.compiler.ast.Node in project gravel by gravel-st.

the class JVMMethodCompiler method produceBlockInlineMessageSend_.

public JVMMethodCompiler produceBlockInlineMessageSend_(final MessageNode _messageNode) {
    final st.gravel.core.Symbol _selector;
    final String[][] _blockSendConstants;
    final int[] _passedNumArgs;
    final JVMVariable[][] _argumentsToCopy;
    _argumentsToCopy = new JVMVariable[1][];
    _blockSendConstants = new String[1][];
    _passedNumArgs = new int[1];
    _blockSendConstants[0] = new String[] {};
    _argumentsToCopy[0] = new JVMVariable[] {};
    _passedNumArgs[0] = 0;
    for (final Node _arg : _messageNode.arguments()) {
        if (_arg.isBlockNode()) {
            final BlockNode _blockNode;
            final JVMVariable[] _nCopiedVariables;
            _blockNode = ((BlockNode) _arg);
            _nCopiedVariables = JVMMethodCompiler.this.copiedVariablesForBlockNode_(_blockNode);
            for (final JVMVariable _each : _nCopiedVariables) {
                if (!st.gravel.support.jvm.ArrayExtensions.includes_(_argumentsToCopy[0], _each)) {
                    _argumentsToCopy[0] = st.gravel.support.jvm.ArrayExtensions.copyWith_(_argumentsToCopy[0], _each);
                }
            }
            _blockSendConstants[0] = st.gravel.support.jvm.ArrayExtensions.copyWith_(_blockSendConstants[0], JVMMethodCompiler.this.addASTConstant_(BlockSendArgument.factory.blockNode_copiedVariables_(_blockNode, _nCopiedVariables)));
        } else {
            _passedNumArgs[0] = ((_passedNumArgs[0]) + 1);
            JVMMethodCompiler.this.visit_(_arg);
            JVMMethodCompiler.this.ensureCast_(JVMDynamicObjectType.factory.basicNew());
            _blockSendConstants[0] = st.gravel.support.jvm.ArrayExtensions.copyWith_(_blockSendConstants[0], null);
        }
    }
    for (final JVMVariable _each : _argumentsToCopy[0]) {
        JVMMethodCompiler.this.produceVarRead_(_each.varName());
        JVMMethodCompiler.this.ensureCast_(_each.type());
    }
    _selector = st.gravel.core.Symbol.value(_messageNode.selector());
    this.emit_(DynamicLiteralBlockMessageSend.factory.functionName_numArgs_blockSendConstants_constantOwner_copiedArguments_(_parent.selectorConverter().selectorAsFunctionName_(_selector), ((_passedNumArgs[0]) + _argumentsToCopy[0].length), _blockSendConstants[0], _parent.ownerType(), st.gravel.support.jvm.ArrayExtensions.collect_(_argumentsToCopy[0], ((st.gravel.support.jvm.Block1<String, JVMVariable>) (new st.gravel.support.jvm.Block1<String, JVMVariable>() {

        @Override
        public String value_(final JVMVariable _each) {
            return (String) _each.varName();
        }
    })))));
    return this;
}
Also used : BlockNode(st.gravel.support.compiler.ast.BlockNode) ArrayList(java.util.ArrayList) List(java.util.List) TypeCast(st.gravel.support.compiler.ast.TypeCast) JVMVariable(st.gravel.support.compiler.jvm.JVMVariable) MessageNode(st.gravel.support.compiler.ast.MessageNode) LocalReadNode(st.gravel.support.compiler.ast.LocalReadNode) ArrayAtPutNode(st.gravel.support.compiler.ast.ArrayAtPutNode) FieldReadNode(st.gravel.support.compiler.ast.FieldReadNode) ReturnNode(st.gravel.support.compiler.ast.ReturnNode) IfTrueIfFalseNode(st.gravel.support.compiler.ast.IfTrueIfFalseNode) HolderDeclarationNode(st.gravel.support.compiler.ast.HolderDeclarationNode) ByteArrayLiteralNode(st.gravel.support.compiler.ast.ByteArrayLiteralNode) DoubleLiteralNode(st.gravel.support.compiler.ast.DoubleLiteralNode) BlockNode(st.gravel.support.compiler.ast.BlockNode) StringLiteralNode(st.gravel.support.compiler.ast.StringLiteralNode) MethodNode(st.gravel.support.compiler.ast.MethodNode) LocalWriteNode(st.gravel.support.compiler.ast.LocalWriteNode) NilLiteralNode(st.gravel.support.compiler.ast.NilLiteralNode) GlobalReadNode(st.gravel.support.compiler.ast.GlobalReadNode) Node(st.gravel.support.compiler.ast.Node) ReferenceLiteralNode(st.gravel.support.compiler.ast.ReferenceLiteralNode) ArraySizeNode(st.gravel.support.compiler.ast.ArraySizeNode) ToDoNode(st.gravel.support.compiler.ast.ToDoNode) FloatLiteralNode(st.gravel.support.compiler.ast.FloatLiteralNode) VariableDeclarationNode(st.gravel.support.compiler.ast.VariableDeclarationNode) SelfNode(st.gravel.support.compiler.ast.SelfNode) CharacterLiteralNode(st.gravel.support.compiler.ast.CharacterLiteralNode) InstanceCreationNode(st.gravel.support.compiler.ast.InstanceCreationNode) CascadeNode(st.gravel.support.compiler.ast.CascadeNode) ArrayAtNode(st.gravel.support.compiler.ast.ArrayAtNode) WhileFalseNode(st.gravel.support.compiler.ast.WhileFalseNode) SymbolLiteralNode(st.gravel.support.compiler.ast.SymbolLiteralNode) WriteHolderNode(st.gravel.support.compiler.ast.WriteHolderNode) BinaryMessageNode(st.gravel.support.compiler.ast.BinaryMessageNode) FieldWriteNode(st.gravel.support.compiler.ast.FieldWriteNode) ReadHolderNode(st.gravel.support.compiler.ast.ReadHolderNode) SuperNode(st.gravel.support.compiler.ast.SuperNode) CreateHolderNode(st.gravel.support.compiler.ast.CreateHolderNode) IsNilNode(st.gravel.support.compiler.ast.IsNilNode) NamespacedVariableNode(st.gravel.support.compiler.ast.NamespacedVariableNode) BooleanAndNode(st.gravel.support.compiler.ast.BooleanAndNode) BooleanOrNode(st.gravel.support.compiler.ast.BooleanOrNode) SequenceNode(st.gravel.support.compiler.ast.SequenceNode) GlobalWriteNode(st.gravel.support.compiler.ast.GlobalWriteNode) IntegerLiteralNode(st.gravel.support.compiler.ast.IntegerLiteralNode) ArrayLiteralNode(st.gravel.support.compiler.ast.ArrayLiteralNode) BooleanLiteralNode(st.gravel.support.compiler.ast.BooleanLiteralNode) IdentityComparisonNode(st.gravel.support.compiler.ast.IdentityComparisonNode) WhileTrueNode(st.gravel.support.compiler.ast.WhileTrueNode) FixedPointLiteralNode(st.gravel.support.compiler.ast.FixedPointLiteralNode) NonLocalReturnNode(st.gravel.support.compiler.ast.NonLocalReturnNode) PushString(st.gravel.support.compiler.jvm.PushString)

Example 3 with Node

use of st.gravel.support.compiler.ast.Node in project gravel by gravel-st.

the class SystemMappingUpdater method localLink_instVars_ownerReference_owner_.

public Node localLink_instVars_ownerReference_owner_(final Node _node, final BoundVariableDeclarationNode[] _instVars, final Reference _ownerReference, final Expression _owner) {
    final Node _intermediate;
    final Node _nonLocal;
    final Node _holderized;
    final Node _fieldAccessed;
    _intermediate = IntermediateNodeRewriter.factory.visit_(_node);
    _nonLocal = NonLocalReturnRewriter.factory.nlrMarker_(_compilerTools.nextNlrMarker()).visit_(_intermediate);
    _holderized = NonLocalTempWritesToHolderConverter.factory.visit_(_nonLocal);
    _fieldAccessed = VariableAccessToFieldAccessConverter.factory.instVars_owner_ownerReference_(_instVars, _owner, _ownerReference).visit_(_holderized);
    return _fieldAccessed;
}
Also used : InstanceCreationNode(st.gravel.support.compiler.ast.InstanceCreationNode) ReturnNode(st.gravel.support.compiler.ast.ReturnNode) UnaryMethodNode(st.gravel.support.compiler.ast.UnaryMethodNode) MethodNode(st.gravel.support.compiler.ast.MethodNode) PragmaNode(st.gravel.support.compiler.ast.PragmaNode) VariableNode(st.gravel.support.compiler.ast.VariableNode) MetaclassNode(st.gravel.support.compiler.ast.MetaclassNode) Node(st.gravel.support.compiler.ast.Node) SharedDeclarationNode(st.gravel.support.compiler.ast.SharedDeclarationNode) SequenceNode(st.gravel.support.compiler.ast.SequenceNode) ClassDescriptionNode(st.gravel.support.compiler.ast.ClassDescriptionNode) SelfNode(st.gravel.support.compiler.ast.SelfNode) NamespaceNode(st.gravel.support.compiler.ast.NamespaceNode) ClassNode(st.gravel.support.compiler.ast.ClassNode) BoundVariableDeclarationNode(st.gravel.support.compiler.ast.BoundVariableDeclarationNode)

Example 4 with Node

use of st.gravel.support.compiler.ast.Node in project gravel by gravel-st.

the class NodeCopier method visit_.

@Override
public Node visit_(final Node _anObject) {
    final Node _newNode;
    if (_anObject == null) {
        return null;
    }
    _newNode = ((Node) _anObject.accept_(this));
    if (_newNode == null) {
        return null;
    }
    return _newNode.withSourcePosition_(_anObject.sourcePosition());
}
Also used : CharacterLiteralNode(st.gravel.support.compiler.ast.CharacterLiteralNode) MessageNode(st.gravel.support.compiler.ast.MessageNode) BlockTypeNode(st.gravel.support.compiler.ast.BlockTypeNode) LiteralNode(st.gravel.support.compiler.ast.LiteralNode) BottomTypeNode(st.gravel.support.compiler.ast.BottomTypeNode) InstanceCreationNode(st.gravel.support.compiler.ast.InstanceCreationNode) LocalReadNode(st.gravel.support.compiler.ast.LocalReadNode) CascadeNode(st.gravel.support.compiler.ast.CascadeNode) ArrayAtPutNode(st.gravel.support.compiler.ast.ArrayAtPutNode) FieldReadNode(st.gravel.support.compiler.ast.FieldReadNode) ArrayAtNode(st.gravel.support.compiler.ast.ArrayAtNode) ReturnNode(st.gravel.support.compiler.ast.ReturnNode) WhileFalseNode(st.gravel.support.compiler.ast.WhileFalseNode) SymbolLiteralNode(st.gravel.support.compiler.ast.SymbolLiteralNode) UnaryMethodNode(st.gravel.support.compiler.ast.UnaryMethodNode) IfTrueIfFalseNode(st.gravel.support.compiler.ast.IfTrueIfFalseNode) GenericTypeVariableNode(st.gravel.support.compiler.ast.GenericTypeVariableNode) WriteHolderNode(st.gravel.support.compiler.ast.WriteHolderNode) HolderDeclarationNode(st.gravel.support.compiler.ast.HolderDeclarationNode) KeywordMessageNode(st.gravel.support.compiler.ast.KeywordMessageNode) TypeDefNode(st.gravel.support.compiler.ast.TypeDefNode) ByteArrayLiteralNode(st.gravel.support.compiler.ast.ByteArrayLiteralNode) BinaryMessageNode(st.gravel.support.compiler.ast.BinaryMessageNode) FieldWriteNode(st.gravel.support.compiler.ast.FieldWriteNode) DoubleLiteralNode(st.gravel.support.compiler.ast.DoubleLiteralNode) BlockNode(st.gravel.support.compiler.ast.BlockNode) ReadHolderNode(st.gravel.support.compiler.ast.ReadHolderNode) SuperNode(st.gravel.support.compiler.ast.SuperNode) StringLiteralNode(st.gravel.support.compiler.ast.StringLiteralNode) MethodNode(st.gravel.support.compiler.ast.MethodNode) CreateHolderNode(st.gravel.support.compiler.ast.CreateHolderNode) StateAccessNode(st.gravel.support.compiler.ast.StateAccessNode) ArrayAccessNode(st.gravel.support.compiler.ast.ArrayAccessNode) PragmaNode(st.gravel.support.compiler.ast.PragmaNode) VariableNode(st.gravel.support.compiler.ast.VariableNode) TraitUsageNode(st.gravel.support.compiler.ast.TraitUsageNode) IsNilNode(st.gravel.support.compiler.ast.IsNilNode) LocalWriteNode(st.gravel.support.compiler.ast.LocalWriteNode) NamespacedVariableNode(st.gravel.support.compiler.ast.NamespacedVariableNode) NilLiteralNode(st.gravel.support.compiler.ast.NilLiteralNode) BooleanAndNode(st.gravel.support.compiler.ast.BooleanAndNode) KeywordMethodNode(st.gravel.support.compiler.ast.KeywordMethodNode) ClassTypeNode(st.gravel.support.compiler.ast.ClassTypeNode) GlobalReadNode(st.gravel.support.compiler.ast.GlobalReadNode) Node(st.gravel.support.compiler.ast.Node) BooleanOrNode(st.gravel.support.compiler.ast.BooleanOrNode) ReferenceLiteralNode(st.gravel.support.compiler.ast.ReferenceLiteralNode) UnaryMessageNode(st.gravel.support.compiler.ast.UnaryMessageNode) ArraySizeNode(st.gravel.support.compiler.ast.ArraySizeNode) ToDoNode(st.gravel.support.compiler.ast.ToDoNode) SharedDeclarationNode(st.gravel.support.compiler.ast.SharedDeclarationNode) BinaryMethodNode(st.gravel.support.compiler.ast.BinaryMethodNode) TypeVariableNode(st.gravel.support.compiler.ast.TypeVariableNode) IntermediateNode(st.gravel.support.compiler.ast.IntermediateNode) SequenceNode(st.gravel.support.compiler.ast.SequenceNode) GlobalWriteNode(st.gravel.support.compiler.ast.GlobalWriteNode) AssignmentNode(st.gravel.support.compiler.ast.AssignmentNode) IntegerLiteralNode(st.gravel.support.compiler.ast.IntegerLiteralNode) ArrayLiteralNode(st.gravel.support.compiler.ast.ArrayLiteralNode) FloatLiteralNode(st.gravel.support.compiler.ast.FloatLiteralNode) ClassDescriptionNode(st.gravel.support.compiler.ast.ClassDescriptionNode) BooleanLiteralNode(st.gravel.support.compiler.ast.BooleanLiteralNode) SelfTypeNode(st.gravel.support.compiler.ast.SelfTypeNode) TypeOrNode(st.gravel.support.compiler.ast.TypeOrNode) IdentityComparisonNode(st.gravel.support.compiler.ast.IdentityComparisonNode) WhileTrueNode(st.gravel.support.compiler.ast.WhileTrueNode) VariableDeclarationNode(st.gravel.support.compiler.ast.VariableDeclarationNode) WhileNode(st.gravel.support.compiler.ast.WhileNode) SelfNode(st.gravel.support.compiler.ast.SelfNode) NamespaceNode(st.gravel.support.compiler.ast.NamespaceNode) ClassNode(st.gravel.support.compiler.ast.ClassNode) NamespacedTypeVariableNode(st.gravel.support.compiler.ast.NamespacedTypeVariableNode) FixedPointLiteralNode(st.gravel.support.compiler.ast.FixedPointLiteralNode) BoundVariableDeclarationNode(st.gravel.support.compiler.ast.BoundVariableDeclarationNode) InstanceTypeNode(st.gravel.support.compiler.ast.InstanceTypeNode) NonLocalReturnNode(st.gravel.support.compiler.ast.NonLocalReturnNode) TypeNode(st.gravel.support.compiler.ast.TypeNode) PackageNode(st.gravel.support.compiler.ast.PackageNode)

Example 5 with Node

use of st.gravel.support.compiler.ast.Node in project gravel by gravel-st.

the class SourcePointerRemover method visit_.

@Override
public Node visit_(final Node _anObject) {
    final Node _newNode;
    if (_anObject == null) {
        return null;
    }
    _newNode = ((Node) _anObject.accept_(this));
    if (_newNode == null) {
        return null;
    }
    return _newNode.withSourcePosition_(null);
}
Also used : Node(st.gravel.support.compiler.ast.Node)

Aggregations

Node (st.gravel.support.compiler.ast.Node)7 MethodNode (st.gravel.support.compiler.ast.MethodNode)6 InstanceCreationNode (st.gravel.support.compiler.ast.InstanceCreationNode)5 NilLiteralNode (st.gravel.support.compiler.ast.NilLiteralNode)5 ReturnNode (st.gravel.support.compiler.ast.ReturnNode)5 SelfNode (st.gravel.support.compiler.ast.SelfNode)5 ArrayAtNode (st.gravel.support.compiler.ast.ArrayAtNode)4 ArrayAtPutNode (st.gravel.support.compiler.ast.ArrayAtPutNode)4 ArrayLiteralNode (st.gravel.support.compiler.ast.ArrayLiteralNode)4 ArraySizeNode (st.gravel.support.compiler.ast.ArraySizeNode)4 BinaryMessageNode (st.gravel.support.compiler.ast.BinaryMessageNode)4 BlockNode (st.gravel.support.compiler.ast.BlockNode)4 BooleanAndNode (st.gravel.support.compiler.ast.BooleanAndNode)4 BooleanLiteralNode (st.gravel.support.compiler.ast.BooleanLiteralNode)4 BooleanOrNode (st.gravel.support.compiler.ast.BooleanOrNode)4 ByteArrayLiteralNode (st.gravel.support.compiler.ast.ByteArrayLiteralNode)4 CascadeNode (st.gravel.support.compiler.ast.CascadeNode)4 CharacterLiteralNode (st.gravel.support.compiler.ast.CharacterLiteralNode)4 CreateHolderNode (st.gravel.support.compiler.ast.CreateHolderNode)4 DoubleLiteralNode (st.gravel.support.compiler.ast.DoubleLiteralNode)4