All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.caoccao.javet.values.reference.IV8ValueFunction Maven / Gradle / Ivy

/*
 * Copyright (c) 2021-2024. caoccao.com Sam Cao
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.caoccao.javet.values.reference;

import com.caoccao.javet.annotations.CheckReturnValue;
import com.caoccao.javet.enums.JSFunctionType;
import com.caoccao.javet.enums.JSScopeType;
import com.caoccao.javet.enums.V8ScopeType;
import com.caoccao.javet.enums.V8ValueInternalType;
import com.caoccao.javet.exceptions.JavetException;
import com.caoccao.javet.interfaces.IJavetClosable;
import com.caoccao.javet.utils.StringUtils;
import com.caoccao.javet.values.V8Value;
import com.caoccao.javet.values.primitive.V8ValueBigInteger;
import com.caoccao.javet.values.primitive.V8ValueZonedDateTime;

import java.math.BigInteger;
import java.time.ZonedDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;

/**
 * The interface V8 value function.
 *
 * @since 0.7.0
 */
public interface IV8ValueFunction extends IV8Cacheable, IV8ValueObject {

    /**
     * Call a function by objects and return V8 value.
     *
     * @param       the type parameter
     * @param receiver the receiver
     * @param objects  the objects
     * @return the V8 value
     * @throws JavetException the javet exception
     * @since 0.8.5
     */
    @CheckReturnValue
    default  T call(V8Value receiver, Object... objects) throws JavetException {
        return callExtended(receiver, true, objects);
    }

    /**
     * Call a function by V8 values and return V8 value.
     *
     * @param       the type parameter
     * @param receiver the receiver
     * @param v8Values the V8 values
     * @return the V8 value
     * @throws JavetException the javet exception
     * @since 0.8.5
     */
    @CheckReturnValue
    default  T call(V8Value receiver, V8Value... v8Values) throws JavetException {
        return callExtended(receiver, true, (Object[]) v8Values);
    }

    /**
     * Call a function as constructor by objects.
     *
     * @param      the type parameter
     * @param objects the objects
     * @return the V8 value
     * @throws JavetException the javet exception
     * @since 0.8.5
     */
    @CheckReturnValue
     T callAsConstructor(Object... objects) throws JavetException;

    /**
     * Call a function as constructor by V8 values.
     *
     * @param       the type parameter
     * @param v8Values the V8 values
     * @return the V8 value
     * @throws JavetException the javet exception
     * @since 0.7.2
     */
    @CheckReturnValue
     T callAsConstructor(V8Value... v8Values) throws JavetException;

    /**
     * Call a function by objects and return big integer.
     *
     * @param receiver the receiver
     * @param objects  the objects
     * @return the big integer
     * @throws JavetException the javet exception
     * @since 1.1.5
     */
    default BigInteger callBigInteger(V8Value receiver, Object... objects) throws JavetException {
        try (V8Value v8Value = callExtended(receiver, true, objects)) {
            if (v8Value instanceof V8ValueBigInteger) {
                return ((V8ValueBigInteger) v8Value).getValue();
            }
        } catch (JavetException e) {
            throw e;
        } catch (Throwable ignored) {
        }
        return null;
    }

    /**
     * Call a function by objects and return boolean.
     *
     * @param receiver the receiver
     * @param objects  the objects
     * @return the boolean
     * @throws JavetException the javet exception
     * @since 0.8.5
     */
    default Boolean callBoolean(V8Value receiver, Object... objects) throws JavetException {
        try (V8Value v8Value = callExtended(receiver, true, objects)) {
            return v8Value.asBoolean();
        } catch (JavetException e) {
            throw e;
        } catch (Throwable t) {
            return null;
        }
    }

    /**
     * Call a function by objects and return double.
     *
     * @param receiver the receiver
     * @param objects  the objects
     * @return the double
     * @throws JavetException the javet exception
     * @since 0.8.5
     */
    default Double callDouble(V8Value receiver, Object... objects) throws JavetException {
        try (V8Value v8Value = callExtended(receiver, true, objects)) {
            return v8Value.asDouble();
        } catch (JavetException e) {
            throw e;
        } catch (Throwable t) {
            return null;
        }
    }

    /**
     * Call a function by objects and return V8 value.
     *
     * @param           the type parameter
     * @param receiver     the receiver
     * @param returnResult the return result
     * @param objects      the objects
     * @return the t
     * @throws JavetException the javet exception
     * @since 0.8.5
     */
    @CheckReturnValue
     T callExtended(V8Value receiver, boolean returnResult, Object... objects)
            throws JavetException;

    /**
     * Call a function by V8 values and return V8 value.
     *
     * @param           the type parameter
     * @param receiver     the receiver
     * @param returnResult the return result
     * @param v8Values     the V8 values
     * @return the t
     * @throws JavetException the javet exception
     * @since 0.8.5
     */
    @CheckReturnValue
     T callExtended(V8Value receiver, boolean returnResult, V8Value... v8Values)
            throws JavetException;

    /**
     * Call a function by objects and return float.
     *
     * @param receiver the receiver
     * @param objects  the objects
     * @return the float
     * @throws JavetException the javet exception
     * @since 0.8.5
     */
    default Float callFloat(V8Value receiver, Object... objects) throws JavetException {
        Double result = callDouble(receiver, objects);
        return result == null ? null : result.floatValue();
    }

    /**
     * Call a function by objects and return integer.
     *
     * @param receiver the receiver
     * @param objects  the objects
     * @return the integer
     * @throws JavetException the javet exception
     * @since 0.8.5
     */
    default Integer callInteger(V8Value receiver, Object... objects) throws JavetException {
        try (V8Value v8Value = callExtended(receiver, true, objects)) {
            return v8Value.asInt();
        } catch (JavetException e) {
            throw e;
        } catch (Throwable t) {
            return null;
        }
    }

    /**
     * Call a function by objects and return long.
     *
     * @param receiver the receiver
     * @param objects  the objects
     * @return the long
     * @throws JavetException the javet exception
     * @since 0.8.5
     */
    default Long callLong(V8Value receiver, Object... objects) throws JavetException {
        try (V8Value v8Value = callExtended(receiver, true, objects)) {
            return v8Value.asLong();
        } catch (JavetException e) {
            throw e;
        } catch (Throwable t) {
            return null;
        }
    }

    /**
     * Call a function by objects and return object.
     *
     * @param       the type parameter
     * @param receiver the receiver
     * @param objects  the objects
     * @return the object
     * @throws JavetException the javet exception
     * @since 0.8.5
     */
    default  T callObject(V8Value receiver, Object... objects) throws JavetException {
        try {
            return getV8Runtime().toObject(callExtended(receiver, true, objects), true);
        } catch (JavetException e) {
            throw e;
        } catch (Throwable t) {
            return null;
        }
    }

    /**
     * Call a function by objects and return string.
     *
     * @param receiver the receiver
     * @param objects  the objects
     * @return the string
     * @throws JavetException the javet exception
     * @since 0.8.5
     */
    default String callString(V8Value receiver, Object... objects) throws JavetException {
        try (V8Value v8Value = callExtended(receiver, true, objects)) {
            if (v8Value.isNullOrUndefined()) {
                return null;
            }
            return v8Value.asString();
        } catch (JavetException e) {
            throw e;
        } catch (Throwable ignored) {
        }
        return null;
    }

    /**
     * Call a function by objects without return.
     *
     * @param receiver the receiver
     * @param objects  the objects
     * @throws JavetException the javet exception
     * @since 0.8.5
     */
    @SuppressWarnings("ResultOfMethodCallIgnored")
    default void callVoid(V8Value receiver, Object... objects) throws JavetException {
        callExtended(receiver, false, objects);
    }

    /**
     * Call a function by V8 values without return.
     *
     * @param receiver the receiver
     * @param v8Values the V8 values
     * @throws JavetException the javet exception
     * @since 0.7.0
     */
    @SuppressWarnings("ResultOfMethodCallIgnored")
    default void callVoid(V8Value receiver, V8Value... v8Values) throws JavetException {
        callExtended(receiver, false, (Object[]) v8Values);
    }

    /**
     * Call a function by objects and return zoned date time.
     *
     * @param receiver the receiver
     * @param objects  the objects
     * @return the zoned date time
     * @throws JavetException the javet exception
     * @since 1.1.5
     */
    default ZonedDateTime callZonedDateTime(V8Value receiver, Object... objects) throws JavetException {
        try (V8Value v8Value = callExtended(receiver, true, objects)) {
            if (v8Value instanceof V8ValueZonedDateTime) {
                return ((V8ValueZonedDateTime) v8Value).getValue();
            }
        } catch (JavetException e) {
            throw e;
        } catch (Throwable ignored) {
        }
        return null;
    }

    /**
     * Can discard compiled byte code.
     *
     * @return true : yes, false : no
     * @throws JavetException the javet exception
     * @since 2.0.1
     */
    boolean canDiscardCompiled() throws JavetException;

    /**
     * Copy the context from the source V8 value function.
     * 

* This allows changing the existing function context on the fly. * It is similar to the live edit in a JavaScript debug tool. * * @param sourceIV8ValueFunction the source V8 value function * @return true : copied, false : not copied * @throws JavetException the javet exception * @since 2.0.1 */ default boolean copyContextFrom(IV8ValueFunction sourceIV8ValueFunction) throws JavetException { try (V8Context v8Context = sourceIV8ValueFunction.getContext()) { return setContext(v8Context); } } /** * Copy the scope info from the source V8 value function. *

* This allows changing the existing function scope info on the fly. * It is similar to the live edit in a JavaScript debug tool. * * @param sourceIV8ValueFunction the source V8 value function * @return true : copied, false : not copied * @throws JavetException the javet exception * @since 2.0.1 */ boolean copyScopeInfoFrom(IV8ValueFunction sourceIV8ValueFunction) throws JavetException; /** * Discard compiled byte code. * * @return true : discarded, false : not discarded * @throws JavetException the javet exception * @since 2.0.1 */ boolean discardCompiled() throws JavetException; /** * Gets arguments. * * @return the arguments * @throws JavetException the javet exception * @since 2.0.3 */ String[] getArguments() throws JavetException; /** * Gets the V8 context. * * @return the V8 context * @throws JavetException the javet exception * @since 2.0.1 */ V8Context getContext() throws JavetException; /** * Gets internal properties. * * @return the internal properties * @throws JavetException the javet exception * @since 0.8.8 */ @CheckReturnValue IV8ValueArray getInternalProperties() throws JavetException; /** * Gets JS function type. * * @return the JS function type * @throws JavetException the javet exception * @since 0.8.8 */ JSFunctionType getJSFunctionType() throws JavetException; /** * Gets JS scope type. * * @return the JS scope type * @throws JavetException the javet exception * @since 0.8.8 */ JSScopeType getJSScopeType() throws JavetException; /** * Gets scope infos. * * @return the scope infos * @throws JavetException the javet exception * @since 2.0.2 */ @CheckReturnValue default ScopeInfos getScopeInfos() throws JavetException { return getScopeInfos(GetScopeInfosOptions.Default); } /** * Gets scope infos. * * @param options the options * @return the scope infos * @throws JavetException the javet exception * @since 2.0.2 */ @CheckReturnValue ScopeInfos getScopeInfos(GetScopeInfosOptions options) throws JavetException; /** * Gets script source. *

* A user-defined JavaScript function is part of a script from start position to end position. * This method returns the source code of the whole script with the start position and end position. * If it is not a user-defined JavaScript function, the return value is null. * * @return the script source * @throws JavetException the javet exception * @since 2.0.1 */ ScriptSource getScriptSource() throws JavetException; /** * Gets source code. * * @return the source code * @throws JavetException the javet exception * @since 0.8.8 */ String getSourceCode() throws JavetException; /** * Is async function. * * @return true : yes, false: no * @throws JavetException the javet exception * @since 0.9.13 */ default boolean isAsyncFunction() throws JavetException { return hasInternalType(V8ValueInternalType.AsyncFunction); } /** * Is this function compiled. * * @return true : yes, false : no * @throws JavetException the javet exception * @since 2.0.1 */ boolean isCompiled() throws JavetException; /** * Is generator function. * * @return true : yes, false: no * @throws JavetException the javet exception * @since 0.9.13 */ default boolean isGeneratorFunction() throws JavetException { return hasInternalType(V8ValueInternalType.GeneratorFunction); } /** * Is wrapped function. *

* Wrapped function means the source code is wrapped in the function. * * @return true : yes, false : no * @throws JavetException the javet exception * @since 2.0.3 */ boolean isWrapped() throws JavetException; /** * Sets the V8 context. * * @param v8Context the V8 context * @return the V8 context * @throws JavetException the javet exception * @since 2.0.1 */ boolean setContext(V8Context v8Context) throws JavetException; /** * Sets script source. * * @param scriptSource the script source * @return true : success, false : failure * @throws JavetException the javet exception * @since 2.0.1 */ default boolean setScriptSource(ScriptSource scriptSource) throws JavetException { return setScriptSource(scriptSource, false); } /** * Sets script source. * * @param scriptSource the script source * @param cloneScript the clone script * @return true : success, false : failure * @throws JavetException the javet exception * @since 2.0.1 */ boolean setScriptSource(ScriptSource scriptSource, boolean cloneScript) throws JavetException; /** * Sets source code with default options. * 1. Do not perform the position calculation at the native layer. * 2. Do not trim the tailing characters. * 3. Do not call GC before of after the call. * * @param sourceCodeString the source code string * @return true : success, false : failure * @throws JavetException the javet exception * @since 0.8.8 */ default boolean setSourceCode(String sourceCodeString) throws JavetException { return setSourceCode(sourceCodeString, SetSourceCodeOptions.DEFAULT); } /** * Sets source code with options. *

* Note 1: The source code is shared among all function objects. * So the caller is responsible for restoring the original source code, * otherwise the next function call will likely fail because the source code * of the next function call is incorrect. * Note 2: The source code must be verified by compile(). Malformed source * code will crash V8. * Note 3: Sometimes the source code must not end with any of ' ', ';', '\n', * though technically the source code is valid. Otherwise, V8 will crash. * * @param sourceCodeString the source code string * @param options the options * @return the source code * @throws JavetException the javet exception * @since 2.0.1 */ boolean setSourceCode(String sourceCodeString, SetSourceCodeOptions options) throws JavetException; /** * The type Get scope infos options. * * @since 2.0.2 */ final class GetScopeInfosOptions implements Cloneable { /** * The constant Default. * * @since 2.0.2 */ public static final GetScopeInfosOptions Default = new GetScopeInfosOptions(); private boolean includeGlobalVariables; private boolean includeScopeTypeGlobal; /** * Instantiates a new Get scope infos options. * * @since 2.0.2 */ public GetScopeInfosOptions() { setIncludeGlobalVariables(false); setIncludeScopeTypeGlobal(false); } @Override protected GetScopeInfosOptions clone() { return new GetScopeInfosOptions() .setIncludeGlobalVariables(isIncludeGlobalVariables()) .setIncludeScopeTypeGlobal(isIncludeScopeTypeGlobal()); } /** * Is include global variables boolean. * * @return true : yes, false : no * @since 2.0.2 */ public boolean isIncludeGlobalVariables() { return includeGlobalVariables; } /** * Is include scope type global boolean. * * @return true : yes, false : no * @since 2.0.2 */ public boolean isIncludeScopeTypeGlobal() { return includeScopeTypeGlobal; } private GetScopeInfosOptions setIncludeGlobalVariables(boolean includeGlobalVariables) { this.includeGlobalVariables = includeGlobalVariables; return this; } private GetScopeInfosOptions setIncludeScopeTypeGlobal(boolean includeScopeTypeGlobal) { this.includeScopeTypeGlobal = includeScopeTypeGlobal; return this; } /** * With include global variables. * * @param includeGlobalVariables the include global variables * @return the self * @since 2.0.2 */ public GetScopeInfosOptions withIncludeGlobalVariables(boolean includeGlobalVariables) { return clone().setIncludeGlobalVariables(includeGlobalVariables); } /** * With include scope type global. * * @param includeScopeTypeGlobal the include scope type global * @return the self * @since 2.0.2 */ public GetScopeInfosOptions withIncludeScopeTypeGlobal(boolean includeScopeTypeGlobal) { return clone().setIncludeScopeTypeGlobal(includeScopeTypeGlobal); } } /** * The type Scope info. * * @since 2.0.2 */ final class ScopeInfo implements IJavetClosable { private final boolean context; private final int endPosition; private final V8ValueObject scopeObject; private final int startPosition; private final V8ScopeType type; /** * Instantiates a new Scope info. * * @param type the type * @param scopeObject the scope object * @param context the context * @param startPosition the start position * @param endPosition the end position * @since 2.0.2 */ ScopeInfo( V8ScopeType type, V8ValueObject scopeObject, boolean context, int startPosition, int endPosition) { this.context = context; this.endPosition = endPosition; this.scopeObject = scopeObject; this.startPosition = startPosition; this.type = type; } @Override public void close() throws JavetException { scopeObject.close(); } /** * Gets end position. * * @return the end position * @since 2.0.2 */ public int getEndPosition() { return endPosition; } /** * Gets scope object. * * @return the scope object * @since 2.0.2 */ public V8ValueObject getScopeObject() { return scopeObject; } /** * Gets start position. * * @return the start position * @since 2.0.2 */ public int getStartPosition() { return startPosition; } /** * Gets type. * * @return the type * @since 2.0.2 */ public V8ScopeType getType() { return type; } /** * Has context. * * @return true : yes, false : no * @since 2.0.2 */ public boolean hasContext() { return context; } @Override public boolean isClosed() { return scopeObject.isClosed(); } } /** * The type Scope infos. * * @since 2.0.2 */ final class ScopeInfos implements IJavetClosable { private static final int INDEX_SCOPE_END_POSITION = 4; private static final int INDEX_SCOPE_HAS_CONTEXT = 2; private static final int INDEX_SCOPE_OBJECT = 1; private static final int INDEX_SCOPE_START_POSITION = 3; private static final int INDEX_SCOPE_TYPE = 0; private final List scopeInfos; /** * Instantiates a new Scope infos. * * @param iV8ValueArray the V8 value array * @throws JavetException the javet exception * @since 2.0.2 */ ScopeInfos(IV8ValueArray iV8ValueArray) throws JavetException { this.scopeInfos = createFrom(iV8ValueArray); } private static List createFrom(IV8ValueArray iV8ValueArray) throws JavetException { final List values = new ArrayList<>(); if (iV8ValueArray != null) { iV8ValueArray.forEach(v8Value -> { if (v8Value instanceof V8ValueArray) { V8ValueArray innerV8ValueArray = (V8ValueArray) v8Value; ScopeInfo scopeInfo = new ScopeInfo( V8ScopeType.parse(innerV8ValueArray.getInteger(INDEX_SCOPE_TYPE)), innerV8ValueArray.get(INDEX_SCOPE_OBJECT), innerV8ValueArray.getBoolean(INDEX_SCOPE_HAS_CONTEXT), innerV8ValueArray.getInteger(INDEX_SCOPE_START_POSITION), innerV8ValueArray.getInteger(INDEX_SCOPE_END_POSITION)); values.add(scopeInfo); } }); } return values; } @Override public void close() throws JavetException { for (ScopeInfo value : scopeInfos) { value.close(); } } /** * Gets scope info by index. * * @param index the index * @return the scope info * @since 2.0.2 */ public ScopeInfo get(int index) { return scopeInfos.get(index); } /** * Gets variables in closure. * * @return the variables in closure * @throws JavetException the javet exception * @since 2.0.2 */ public List> getVariablesInClosure() throws JavetException { List> variablesList = new ArrayList<>(); for (ScopeInfo scopeInfo : scopeInfos) { variablesList.add(scopeInfo.getScopeObject().getOwnPropertyNameStrings()); } return variablesList; } /** * Has variables in closure. * * @return true : yes, false : no * @throws JavetException the javet exception * @since 2.0.2 */ public boolean hasVariablesInClosure() throws JavetException { for (V8ValueObject v8ValueObject : scopeInfos.stream() .filter(scopeInfo -> scopeInfo.getType() == V8ScopeType.Closure) .map(ScopeInfo::getScopeObject) .collect(Collectors.toList())) { try (IV8ValueArray iV8ValueArray = v8ValueObject.getOwnPropertyNames()) { if (iV8ValueArray.getLength() > 0) { return true; } } } return false; } @Override public boolean isClosed() { return scopeInfos.stream().allMatch(ScopeInfo::isClosed); } /** * Gets the size. * * @return the size * @since 2.0.2 */ public int size() { return scopeInfos.size(); } } /** * The type Script source. *

* It is immutable. * * @since 2.0.1 */ final class ScriptSource { private final String code; private final int endPosition; private final int startPosition; /** * Instantiates a new Script source. * * @param code the code * @param startPosition the start position * @param endPosition the end position * @since 2.0.1 */ public ScriptSource(String code, int startPosition, int endPosition) { Objects.requireNonNull(code, "Code cannot be null."); assert startPosition >= 0 : "Start position must be no less than 0."; assert endPosition > startPosition : "End position must be greater than start position."; assert endPosition <= code.length() : "End position must be no greater than the length of the code."; this.code = code; this.startPosition = startPosition; this.endPosition = endPosition; } /** * Instantiates a new Script source. * * @param code the code * @since 2.0.1 */ public ScriptSource(String code) { this(Objects.requireNonNull(code), 0, code.length()); } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; ScriptSource that = (ScriptSource) o; return getEndPosition() == that.getEndPosition() && getStartPosition() == that.getStartPosition() && getCode().equals(that.getCode()); } /** * Gets code. * * @return the code * @since 2.0.1 */ public String getCode() { return code; } /** * Gets code snippet from the start position to the end position. * * @return the code snippet * @since 2.0.1 */ public String getCodeSnippet() { return code.substring(startPosition, endPosition); } /** * Gets end position. * * @return the end position * @since 2.0.1 */ public int getEndPosition() { return endPosition; } /** * Gets start position. * * @return the start position * @since 2.0.1 */ public int getStartPosition() { return startPosition; } @Override public int hashCode() { return Objects.hash(getCode(), getEndPosition(), getStartPosition()); } /** * Returns a new script source with the code snippet replaced and positions re-calculated. * * @param codeSnippet the code snippet * @return a new script source * @since 2.0.1 */ public ScriptSource setCodeSnippet(String codeSnippet) { if (StringUtils.isNotEmpty(codeSnippet)) { final int originalCodeLength = code.length(); final int codeSnippetLength = codeSnippet.length(); final int newCodeLength = originalCodeLength - (endPosition - startPosition) + codeSnippetLength; StringBuilder sb = new StringBuilder(newCodeLength); sb.append(code, 0, startPosition); sb.append(codeSnippet); sb.append(code, endPosition, originalCodeLength); return new ScriptSource( sb.toString(), startPosition, startPosition + codeSnippetLength); } return this; } } /** * The enum Set source code options. * * @since 2.0.1 */ final class SetSourceCodeOptions implements Cloneable { /** * The constant DEFAULT with all options disabled. * * @since 2.0.1 */ public static final SetSourceCodeOptions DEFAULT = new SetSourceCodeOptions(); /** * The constant GC with PreGC and PostGC enabled. * * @since 2.0.1 */ public static final SetSourceCodeOptions GC = new SetSourceCodeOptions() .setPreGC(true).setPostGC(true); /** * The constant NATIVE_GC with PreGC, PostGC and NativeCalculation enabled. * * @since 2.0.1 */ public static final SetSourceCodeOptions NATIVE_GC = new SetSourceCodeOptions() .setPreGC(true).setPostGC(true).setNativeCalculation(true); private boolean cloneScript; private boolean nativeCalculation; private boolean postGC; private boolean preGC; private boolean trimTailingCharacters; private SetSourceCodeOptions() { setCloneScript(false).setPreGC(false).setPostGC(false); setNativeCalculation(false).setTrimTailingCharacters(false); } @Override protected SetSourceCodeOptions clone() { return new SetSourceCodeOptions() .setCloneScript(isCloneScript()) .setNativeCalculation(isNativeCalculation()) .setPreGC(isPreGC()) .setPostGC(isPostGC()) .setTrimTailingCharacters(isTrimTailingCharacters()); } /** * CloneScript: Clone the script so that the original script is not affected. *

* When this option is turned on, it is called LiveEdit in V8. * * @return true : enabled, false: disabled */ public boolean isCloneScript() { return cloneScript; } /** * NativeCalculation: The position calculation is performed at the native layer. * * @return true : enabled, false: disabled * @since 2.0.1 */ public boolean isNativeCalculation() { return nativeCalculation; } /** * PostGC: The GC is called after the set call happens. * * @return true : enabled, false: disabled * @since 2.0.1 */ public boolean isPostGC() { return postGC; } /** * PreGC: The GC is called before the set call happens. * * @return true : enabled, false: disabled * @since 2.0.1 */ public boolean isPreGC() { return preGC; } /** * TrimTailingCharacters: Sometimes the source code must not end with ' ', '\n', '\r', 't', ';', * otherwise, V8 will crash immediately. * * @return true : enabled, false: disabled * @since 2.0.1 */ public boolean isTrimTailingCharacters() { return trimTailingCharacters; } private SetSourceCodeOptions setCloneScript(boolean cloneScript) { this.cloneScript = cloneScript; return this; } private SetSourceCodeOptions setNativeCalculation(boolean nativeCalculation) { this.nativeCalculation = nativeCalculation; return this; } private SetSourceCodeOptions setPostGC(boolean postGC) { this.postGC = postGC; return this; } private SetSourceCodeOptions setPreGC(boolean preGC) { this.preGC = preGC; return this; } private SetSourceCodeOptions setTrimTailingCharacters(boolean trimTailingCharacters) { this.trimTailingCharacters = trimTailingCharacters; return this; } /** * Returns a new immutable options with CloneScript set. * * @param cloneScript the clone script * @return the new immutable options * @since 2.0.1 */ public SetSourceCodeOptions withCloneScript(boolean cloneScript) { return clone().setCloneScript(cloneScript); } /** * Returns a new immutable options with NativeCalculation set. * * @param nativeCalculation the native calculation * @return the new immutable options * @since 2.0.1 */ public SetSourceCodeOptions withNativeCalculation(boolean nativeCalculation) { return clone().setNativeCalculation(nativeCalculation); } /** * Returns a new immutable options with PostGC set. * * @param postGC the post gc * @return the new immutable options * @since 2.0.1 */ public SetSourceCodeOptions withPostGC(boolean postGC) { return clone().setPostGC(postGC); } /** * Returns a new immutable options with PreGC set. * * @param preGC the pre gc * @return the new immutable options * @since 2.0.1 */ public SetSourceCodeOptions withPreGC(boolean preGC) { return clone().setPreGC(preGC); } /** * Returns a new immutable options with TrimTrailingCharacters set. * * @param trimTrailingCharacters the trim trailing characters * @return the new immutable options * @since 2.0.1 */ public SetSourceCodeOptions withTrimTailingCharacters(boolean trimTrailingCharacters) { return clone().setTrimTailingCharacters(trimTrailingCharacters); } } }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy