/**
* 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.scripting;
import static com.github.anba.es6draft.runtime.internal.Errors.newReferenceError;
import static com.github.anba.es6draft.runtime.types.Undefined.UNDEFINED;
import static com.github.anba.es6draft.scripting.TypeConverter.fromJava;
import static com.github.anba.es6draft.scripting.TypeConverter.toJava;
import java.util.Set;
import javax.script.ScriptContext;
import com.github.anba.es6draft.runtime.EnvironmentRecord;
import com.github.anba.es6draft.runtime.ExecutionContext;
import com.github.anba.es6draft.runtime.internal.Messages;
import com.github.anba.es6draft.runtime.types.ScriptObject;
/**
*
*/
final class ScriptContextEnvironmentRecord implements EnvironmentRecord {
private final ExecutionContext cx;
private final ScriptContext context;
public ScriptContextEnvironmentRecord(ExecutionContext cx, ScriptContext context) {
this.cx = cx;
this.context = context;
}
@Override
public Set<String> bindingNames() {
return context.getBindings(ScriptContext.ENGINE_SCOPE).keySet();
}
@Override
public boolean hasBinding(String name) {
return context.getAttributesScope(name) != -1;
}
@Override
public void createMutableBinding(String name, boolean deletable) {
setMutableBinding(name, UNDEFINED, false);
}
@Override
public void createImmutableBinding(String name, boolean strict) {
setMutableBinding(name, UNDEFINED, false);
}
@Override
public void initializeBinding(String name, Object value) {
setMutableBinding(name, value, false);
}
@Override
public void setMutableBinding(String name, Object value, boolean strict) {
context.setAttribute(name, toJava(value), ScriptContext.ENGINE_SCOPE);
}
@Override
public Object getBindingValue(String name, boolean strict) {
int scope = context.getAttributesScope(name);
if (scope == -1) {
if (strict) {
throw newReferenceError(cx, Messages.Key.UnresolvableReference);
}
return UNDEFINED;
}
return fromJava(context.getAttribute(name, scope));
}
@Override
public boolean deleteBinding(String name) {
return context.removeAttribute(name, ScriptContext.ENGINE_SCOPE) != null;
}
@Override
public boolean hasThisBinding() {
return false;
}
@Override
public boolean hasSuperBinding() {
return false;
}
@Override
public ScriptObject withBaseObject() {
return null;
}
@Override
public Object getThisBinding(ExecutionContext cx) {
throw new IllegalStateException();
}
}