package org.jruby.ir.operands;

import org.jruby.ir.IRScope;
import org.jruby.ir.IRVisitor;
import org.jruby.ir.transformations.inlining.CloneInfo;
import org.jruby.parser.StaticScope;
import org.jruby.runtime.DynamicScope;
import org.jruby.runtime.ThreadContext;
import org.jruby.runtime.builtin.IRubyObject;

import java.util.List;

Reference a StaticScope/IRScope. This could be used wherever we know a staticscope will be used but we initially favor CurrentScope as it is a single instance and it reduces an object allocation for every scope in the system. Note: we store IRScope because JIT can easily store IRScopes vs making new JIT infrastructure for StaticScope (and from a scoping standpoint these two types are 1:1). However, once we inline we are migrating things referencing a currentscope which no longer exists. In this case, we need replace CurrentScope with a Scope.
/** * Reference a StaticScope/IRScope. This could be used wherever we know a staticscope will * be used but we initially favor CurrentScope as it is a single instance and it reduces an * object allocation for every scope in the system. Note: we store IRScope because JIT can * easily store IRScopes vs making new JIT infrastructure for StaticScope (and from a scoping * standpoint these two types are 1:1). * * However, once we inline we are migrating things referencing a currentscope which * no longer exists. In this case, we need replace CurrentScope with a Scope. */
public class Scope extends Operand { private IRScope scope; public Scope(IRScope scope) { this.scope = scope; } @Override public OperandType getOperandType() { return OperandType.SCOPE; } @Override public void addUsedVariables(List<Variable> l) { } public IRScope getScope() { return scope; } @Override public void visit(IRVisitor visitor) { visitor.Scope(this); } @Override public Operand cloneForInlining(CloneInfo ii) { return this; } @Override public Object retrieve(ThreadContext context, IRubyObject self, StaticScope currScope, DynamicScope currDynScope, Object[] temp) { return scope.getStaticScope(); } }