/**
* Copyright (c) 2012-2016 André Bargull
* Alle Rechte vorbehalten / All Rights Reserved. Use is subject to license terms.
*
* <https://github.com/anba/es6draft>
*/
package com.github.anba.es6draft.runtime.internal;
/**
* Method execution resumption point.
*/
public final class ResumptionPoint {
private final Object[] stack;
private final Object[] locals;
private final int offset;
// Null for generator frames, non-null for other method frames.
private final ResumptionPoint next;
private ResumptionPoint(Object[] stack, Object[] locals, int offset, ResumptionPoint next) {
assert stack != null && offset >= 0;
this.stack = stack;
this.locals = locals;
this.offset = offset;
this.next = next;
}
/**
* Creates a new {@link ResumptionPoint} object.
*
* @param stack
* the current stack
* @param locals
* the current locals
* @param offset
* the resumption point offset
* @return the new resumption point
*/
public static ResumptionPoint create(Object[] stack, Object[] locals, int offset) {
return new ResumptionPoint(stack, locals, offset, null);
}
/**
* Creates a new {@link ResumptionPoint} object.
*
* @param stack
* the current stack
* @param locals
* the current locals
* @param offset
* the resumption point offset
* @param next
* the next resumption point
* @return the new resumption point
*/
public static ResumptionPoint create(Object[] stack, Object[] locals, int offset, ResumptionPoint next) {
return new ResumptionPoint(stack, locals, offset, next);
}
/**
* Returns the suspend value.
*
* @return the suspend value
*/
public Object getSuspendValue() {
if (next == null) {
assert stack.length > 0;
return stack[stack.length - 1];
}
return next.getSuspendValue();
}
/**
* Sets the resume value.
*
* @param value
* the resume value
*/
public void setResumeValue(Object value) {
if (next == null) {
assert stack.length > 0;
stack[stack.length - 1] = value;
} else {
next.setResumeValue(value);
}
}
/**
* Returns the stored stack.
*
* @return the stored stack
*/
public Object[] getStack() {
return stack;
}
/**
* Returns the stored locals.
*
* @return the stored locals
*/
public Object[] getLocals() {
return locals;
}
/**
* Returns the stored offset.
*
* @return the execution offset
*/
public int getOffset() {
return offset;
}
}