#include "Node.h"

extern oop s_self;
extern oop s_nil;
extern oop s_v_;

//  oop	mEncoder;
//  oop	mSequence;

ExecNode::ExecNode(oop sequence)
{
  mSequence= sequence;
  mEncoder=  0;
}

oop ExecNode::withSequence(oop sequence)
{
  return new ExecNode(sequence);
}

oop ExecNode::encodeIn(oop unit)
{
  mEncoder= new Encoder(unit, 0);
  mEncoder->declare(s_self, new LocalVariable(s_self, *s_v_ + s_nil, 1));			// declare self
  mSequence= mSequence->encode(mEncoder);
  return this;
}

oop ExecNode::genDeclarationIn(oop unit)
{
  mEncoder->genDefinitions();
  return this;
}

oop ExecNode::genImplementationIn(oop unit)
{
  mEncoder->genImplementations();
  return this;  return this;
}

oop ExecNode::genInitialisationIn(oop unit)
{
  mEncoder->genInitialisations();
  oop stream= unit->outputStream();
  stream->format("  {\n");
  if (mEncoder->exports())
    stream->format("  oop *_state= (oop *)_newPointers(sizeof(oop) * %d);\n", mEncoder->exports());
  mSequence->genBody(unit, mEncoder);
  stream->format("  }\n");
  return this;
}

oop ExecNode::printOnIndent(oop stream, int indent)
{
  stream
    ->space(indent * 2)
    ->format("ExecNode")
    ->nl();
  mSequence->printOnIndent(stream, indent + 1);
  return this;
}

oop ExecNode::printOn(oop stream)
{
  stream->format("ExecNode(");
  mSequence->printOnIndent(stream, 1);
  stream->format(")");
  return this;
}
