/**
* 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.types;
import com.github.anba.es6draft.runtime.ExecutionContext;
import com.github.anba.es6draft.runtime.Realm;
/**
* <h1>6 ECMAScript Data Types and Values</h1><br>
* <h2>6.1 ECMAScript Language Types</h2><br>
* <h3>6.1.7 The Object Type</h3>
* <ul>
* <li>6.1.7.2 Object Internal Methods and Internal Slots
* </ul>
* <p>
* Internal Method: [[Call]]
*/
public interface Callable extends ScriptObject {
/**
* [[Call]]
*
* @param callerContext
* the caller's execution context
* @param thisValue
* the this-value
* @param args
* the function arguments
* @return the function return value
*/
Object call(ExecutionContext callerContext, Object thisValue, Object... args);
/**
* [[Call]] in tail-call position
*
* @param callerContext
* the caller's execution context
* @param thisValue
* the this-value
* @param args
* the function arguments
* @return the function return value
* @throws Throwable
* any error thrown by the underlying method implementation
*/
Object tailCall(ExecutionContext callerContext, Object thisValue, Object... args) throws Throwable;
/**
* Returns a copy of this function object with the same internal methods and internal slots.
*
* @param cx
* the execution context
* @return the new function object
*/
Callable clone(ExecutionContext cx); // TODO: Function.p.toMethod was removed, remove clone, too?
/**
* Returns the function's realm component.
*
* @param cx
* the execution context
* @return the function's realm
*/
Realm getRealm(ExecutionContext cx);
@Override
default String className() {
return "Function";
}
/**
* Source representation of this callable.
*
* @param cx
* the execution context
* @return the function source
*/
String toSource(ExecutionContext cx);
}