evaluator

package
v0.24.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Sep 1, 2026 License: MIT Imports: 21 Imported by: 0

Documentation

Index

Constants

View Source
const DefaultMaxCallDepth = 1000

DefaultMaxCallDepth is the default maximum call depth (1000)

Variables

View Source
var (
	NULL  = &object.Null{}
	TRUE  = object.NewBoolean(true)
	FALSE = object.NewBoolean(false)
)
View Source
var BytesBuiltin = &object.Builtin{
	Fn: bytesConstructorFn,
	HelpText: `bytes(source="", encoding="utf-8") - Construct a Bytes value

Returns an immutable Bytes object holding the given binary data. Bytes is the
canonical binary type in Scriptling and is produced by hashlib.digest(),
hmac.digest(), base64.b64decode(), and msgpack.packb().

Parameters:
  source:  A string (encoded as UTF-8), a list/tuple of ints (0-255),
           an existing Bytes value, or nothing (empty bytes).
  encoding (str, optional): Encoding to use when source is a string.
           Only "utf-8" is supported. Default: "utf-8".

Returns:
  bytes: a Bytes object.

Example:
  b = bytes("hi")          # b'hi'
  b = bytes([104, 105])    # b'hi'
  b = bytes()              # b''
  s = b.decode()           # "hi"
  b = bytes.fromhex("6869") # b'hi'`,
	Attributes: map[string]object.Object{
		"fromhex": &object.Builtin{
			Fn: func(ctx context.Context, kwargs object.Kwargs, args ...object.Object) object.Object {
				if err := errors.ExactArgs(args, 1); err != nil {
					return err
				}
				s, err := args[0].AsString()
				if err != nil {
					return err
				}
				decoded, decodeErr := hex.DecodeString(s)
				if decodeErr != nil {
					return errors.NewError("bytes.fromhex: %s", decodeErr.Error())
				}
				return object.NewBytes(decoded)
			},
			HelpText: `bytes.fromhex(hex_string) - Build Bytes from a hex string

Returns a Bytes value whose contents are the decoded hex.

Example:
  b = bytes.fromhex("6869")   # b'hi'`,
		},
		"frombase64": &object.Builtin{
			Fn: func(ctx context.Context, kwargs object.Kwargs, args ...object.Object) object.Object {
				if err := errors.ExactArgs(args, 1); err != nil {
					return err
				}
				s, err := args[0].AsString()
				if err != nil {
					return err
				}
				decoded, decodeErr := base64.StdEncoding.DecodeString(s)
				if decodeErr != nil {
					return errors.NewError("bytes.frombase64: %s", decodeErr.Error())
				}
				return object.NewBytes(decoded)
			},
			HelpText: `bytes.frombase64(b64_string) - Build Bytes from a Base64 string

Returns a Bytes value whose contents are the decoded Base64 input.

Example:
  b = bytes.frombase64("aGk=")   # b'hi'`,
		},
	},
}

BytesBuiltin is the global bytes builtin. Calling bytes(...) invokes the constructor; bytes.fromhex(...) and bytes.frombase64(...) go through the Attributes map.

Functions

func ApplyFunctionGIL added in v0.15.0

func ApplyFunctionGIL(ctx context.Context, fn object.Object, args []object.Object, keywords map[string]object.Object, env *object.Environment) object.Object

applyFunction calls a function object with arguments and keyword arguments.

It is unexported because it does NOT acquire the interpreter lock: it is the internal dispatch used while the lock is already held (dunder-method dispatch, recursion, etc.). The locking boundaries are EvalWithContext, ApplyFunctionGIL, and the evaliface adapter (CallFunction/CallObjectFunction/CallMethod). Go callers outside the evaluator package must use ApplyFunctionGIL.

ApplyFunctionGIL acquires the environment's interpreter lock (reentrant via goroutine-id ownership, so nested calls from the same goroutine don't deadlock) and then dispatches via applyFunction. Host code that calls script functions — especially concurrently against a shared environment — must use this rather than the unexported applyFunction, which assumes the lock is held.

func ContextWithCallDepth

func ContextWithCallDepth(ctx context.Context, maxDepth int) context.Context

ContextWithCallDepth creates a context with a call depth tracker

func ContextWithSourceFile

func ContextWithSourceFile(ctx context.Context, filename string) context.Context

ContextWithSourceFile creates a context with source file info for error reporting

func Eval

func Eval(node ast.Node, env *object.Environment) object.Object

Eval executes without context (backwards compatible)

func EvalWithContext

func EvalWithContext(ctx context.Context, node ast.Node, env *object.Environment) object.Object

EvalWithContext executes with context for timeout/cancellation

func GetEnvFromContext

func GetEnvFromContext(ctx context.Context) *object.Environment

GetEnvFromContext retrieves environment from context for external functions

func GetImportBuiltin

func GetImportBuiltin() *object.Builtin

func GetSourceFileFromContext

func GetSourceFileFromContext(ctx context.Context) string

GetSourceFileFromContext retrieves source file name from context

func SetCallDepthInContext

func SetCallDepthInContext(ctx context.Context, cd *CallDepth) context.Context

SetCallDepthInContext stores call depth tracker in context

func SetEnvInContext

func SetEnvInContext(ctx context.Context, env *object.Environment) context.Context

SetEnvInContext stores environment in context for builtin functions.

Every builtin call goes through here, and context.WithValue allocates, so the result is memoised on the environment: the base context is stable for the duration of an evaluation, so the same derived context can be handed out repeatedly instead of rebuilt per call.

func WithEvaluator

func WithEvaluator(ctx context.Context) context.Context

WithEvaluator adds evaluator to context

Types

type CallDepth

type CallDepth struct {
	// contains filtered or unexported fields
}

CallDepth tracks function call depth to prevent stack overflow

func GetCallDepthFromContext

func GetCallDepthFromContext(ctx context.Context) *CallDepth

GetCallDepthFromContext retrieves call depth tracker from context

func NewCallDepth

func NewCallDepth(maxDepth int) *CallDepth

NewCallDepth creates a new CallDepth tracker with the specified max depth

func (*CallDepth) Depth

func (cd *CallDepth) Depth() int

Depth returns current call depth

func (*CallDepth) Enter

func (cd *CallDepth) Enter() bool

Enter increments call depth and returns true if within limits

func (*CallDepth) Exit

func (cd *CallDepth) Exit()

Exit decrements call depth

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL