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;
}
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;
}
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;
}
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());
}
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);
}
Aggregations