From c3459153df9d9ee0fbd321699bd4bf571bc61df8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stanis=C5=82aw=20Barzowski?= Date: Tue, 3 Oct 2017 14:27:44 -0400 Subject: [PATCH] Location, error formatting and stack trace improvements (#59) * Location, error formatting and stack trace improvements * Static context for AST nodes * Thunks no longer need `name` * Prototype for showing snippets in error messages (old format still available) * Use ast.Function to represent methods and local function sugar. * Change tests so that the error output is pretty --- ast/ast.go | 30 +- ast/location.go | 123 +- builtins.go | 2 +- desugarer.go | 32 +- error_formatter.go | 52 +- evaluator.go | 6 +- imports.go | 2 +- interpreter.go | 32 +- main_test.go | 21 +- parser/context.go | 371 +++ parser/lexer.go | 47 +- parser/parser.go | 71 +- parser/parser_test.go | 51 +- parser/static_error.go | 4 - runtime_error.go | 9 +- "testdata/\".golden" | 4 + testdata/'.golden | 4 + testdata/arrcomp5.golden | 4 + testdata/arrcomp_if4.golden | 4 + testdata/arrcomp_if6.golden | 12 + testdata/arrcomp_if7.golden | 10 + testdata/assert3.golden | 7 + testdata/assert_equal4.golden | 14 + testdata/assert_equal5.golden | 17 + testdata/assert_equal5.jsonnet | 1 + testdata/assert_equal6.golden | 15 + testdata/assert_equal6.jsonnet | 1 + testdata/assert_failed.golden | 7 + testdata/assert_failed_custom.golden | 7 + testdata/bad_function_call.golden | 9 + testdata/bad_function_call2.golden | 9 + testdata/bad_function_call_and_error.golden | 9 + testdata/bitwise_and4.golden | 14 + testdata/bitwise_xor7.golden | 14 + testdata/block_string.golden | 1 + testdata/block_string.jsonnet | 5 + testdata/builtinChar3.golden | 7 + testdata/builtinChar5.golden | 7 + testdata/builtinObjectHasExBadField.golden | 7 + testdata/builtinObjectHasExBadObject.golden | 7 + testdata/builtin_exp3.golden | 7 + testdata/builtin_exp5.golden | 7 + testdata/builtin_log5.golden | 7 + testdata/builtin_log7.golden | 7 + testdata/builtin_log8.golden | 7 + testdata/call_number.golden | 9 + testdata/div4.golden | 9 + testdata/div_by_zero.golden | 9 + testdata/double_thunk.golden | 20 + testdata/double_thunk.jsonnet | 1 + testdata/error.golden | 9 + testdata/error_from_array.golden | 15 + testdata/error_from_array.jsonnet | 1 + testdata/error_from_func.golden | 15 + testdata/error_from_func.jsonnet | 1 + testdata/error_hexnumber.golden | 4 + testdata/error_in_method.golden | 15 + testdata/error_in_method.jsonnet | 4 + testdata/error_in_object_local.golden | 15 + testdata/error_in_object_local.jsonnet | 1 + testdata/extvar_error.golden | 12 + testdata/extvar_hermetic.golden | 4 + testdata/extvar_static_error.golden | 4 + testdata/extvar_unknown.golden | 7 + testdata/fieldname_not_string.golden | 9 + testdata/function.golden | 4 + testdata/import_block_literal.golden | 6 + testdata/import_computed.golden | 4 + testdata/import_failure_directory.golden | 9 + .../import_various_literals_escaped.golden | 4 + testdata/importstr_block_literal.golden | 6 + testdata/importstr_computed.golden | 4 + testdata/insuper2.golden | 4 + testdata/insuper4.golden | 4 + testdata/insuper6.golden | 4 + testdata/lazy_operator2.golden | 14 + testdata/nonexistent_import.golden | 9 + testdata/nonexistent_import_crazy.golden | 9 + testdata/number_leading_zero.golden | 4 + testdata/object_comp_assert.golden | 4 + testdata/object_comp_bad_field.golden | 4 + testdata/object_comp_bad_field2.golden | 4 + testdata/object_comp_duplicate.golden | 7 + testdata/object_comp_err_elem.golden | 9 + testdata/object_comp_err_index.golden | 12 + testdata/object_comp_illegal.golden | 4 + testdata/object_comp_int_index.golden | 12 + testdata/object_invariant10.golden | 7 + testdata/object_invariant11.golden | 12 + testdata/object_invariant13.golden | 9 + testdata/object_invariant14.golden | 7 + testdata/object_invariant2.golden | 7 + testdata/object_invariant7.golden | 33 + testdata/object_invariant8.golden | 7 + testdata/object_invariant9.golden | 7 + testdata/object_invariant_plus.golden | 7 + testdata/object_invariant_plus2.golden | 7 + testdata/object_invariant_plus6.golden | 7 + testdata/object_local.golden | 3 + testdata/object_local.jsonnet | 2 + testdata/object_local_self_super.golden | 6 + testdata/object_local_self_super.jsonnet | 1 + testdata/or4.golden | 14 + testdata/or5.golden | 9 + testdata/or6.golden | 9 + testdata/percent_bad.golden | 12 + testdata/percent_bad2.golden | 27 + testdata/percent_bad3.golden | 12 + testdata/percent_format_str4.golden | 37 + testdata/percent_format_str5.golden | 143 + testdata/percent_format_str6.golden | 143 + testdata/percent_format_str7.golden | 121 + testdata/percent_mod_int5.golden | 10 + testdata/plus5.golden | 9 + testdata/pow4.golden | 7 + testdata/pow7.golden | 7 + testdata/recursive_thunk.golden | 50 + testdata/recursive_thunk.jsonnet | 3 + testdata/static_error_eof.golden | 5 + testdata/static_error_eof.jsonnet | 1 + testdata/std.codepoint3.golden | 7 + testdata/std.codepoint6.golden | 7 + testdata/std.codepoint7.golden | 7 + testdata/std.filter2.golden | 12 + testdata/std.filter4.golden | 7 + testdata/std.filter5.golden | 7 + testdata/std.filter6.golden | 7 + testdata/std.filter_swapped_args.golden | 7 + testdata/std.flatmap5.golden | 15 + ...recursive_evalutation_order_matters.golden | 2504 +++++++++++++++++ testdata/std.md5_6.golden | 7 + testdata/std.primitiveEquals10.golden | 12 + testdata/std.primitiveEquals13.golden | 7 + testdata/std.primitiveEquals6.golden | 7 + testdata/std.primitiveEquals7.golden | 7 + testdata/std.primitiveEquals9.golden | 12 + testdata/std.toString5.golden | 12 + testdata/string_index_negative.golden | 9 + testdata/string_index_out_of_bounds.golden | 9 + testdata/supersugar8.golden | 7 + testdata/type_error.golden | 12 + testdata/unfinished_args.golden | 4 + testdata/variable_not_visible.golden | 4 + thunks.go | 17 +- vm.go | 2 +- 145 files changed, 4663 insertions(+), 175 deletions(-) create mode 100644 parser/context.go create mode 100644 testdata/assert_equal5.golden create mode 100644 testdata/assert_equal5.jsonnet create mode 100644 testdata/assert_equal6.golden create mode 100644 testdata/assert_equal6.jsonnet create mode 100644 testdata/block_string.golden create mode 100644 testdata/block_string.jsonnet create mode 100644 testdata/double_thunk.golden create mode 100644 testdata/double_thunk.jsonnet create mode 100644 testdata/error_from_array.golden create mode 100644 testdata/error_from_array.jsonnet create mode 100644 testdata/error_from_func.golden create mode 100644 testdata/error_from_func.jsonnet create mode 100644 testdata/error_in_method.golden create mode 100644 testdata/error_in_method.jsonnet create mode 100644 testdata/error_in_object_local.golden create mode 100644 testdata/error_in_object_local.jsonnet create mode 100644 testdata/object_local.golden create mode 100644 testdata/object_local.jsonnet create mode 100644 testdata/object_local_self_super.golden create mode 100644 testdata/object_local_self_super.jsonnet create mode 100644 testdata/recursive_thunk.golden create mode 100644 testdata/recursive_thunk.jsonnet create mode 100644 testdata/static_error_eof.golden create mode 100644 testdata/static_error_eof.jsonnet diff --git a/ast/ast.go b/ast/ast.go index 9e6ad43..62093da 100644 --- a/ast/ast.go +++ b/ast/ast.go @@ -30,10 +30,14 @@ type Identifiers []Identifier // --------------------------------------------------------------------------- +type Context *string + type Node interface { + Context() Context Loc() *LocationRange FreeVariables() Identifiers SetFreeVariables(Identifiers) + SetContext(Context) } type Nodes []Node @@ -41,6 +45,7 @@ type Nodes []Node type NodeBase struct { loc LocationRange + context Context freeVariables Identifiers } @@ -70,6 +75,14 @@ func (n *NodeBase) SetFreeVariables(idents Identifiers) { n.freeVariables = idents } +func (n *NodeBase) Context() Context { + return n.context +} + +func (n *NodeBase) SetContext(context Context) { + n.context = context +} + // --------------------------------------------------------------------------- type IfSpec struct { @@ -356,11 +369,9 @@ type Slice struct { // LocalBind is a helper struct for astLocal type LocalBind struct { - Variable Identifier - Body Node - FunctionSugar bool - Params *Parameters // if functionSugar is true - TrailingComma bool + Variable Identifier + Body Node + Fun *Function } type LocalBinds []LocalBind @@ -439,7 +450,8 @@ type ObjectField struct { Hide ObjectFieldHide // (ignore if kind != astObjectField*) SuperSugar bool // +: (ignore if kind != astObjectField*) MethodSugar bool // f(x, y, z): ... (ignore if kind == astObjectAssert) - Expr1 Node // Not in scope of the object + Method *Function + Expr1 Node // Not in scope of the object Id *Identifier Params *Parameters // If methodSugar == true then holds the params. TrailingComma bool // If methodSugar == true then remembers the trailing comma @@ -448,12 +460,8 @@ type ObjectField struct { // TODO(jbeda): Add the remaining constructor helpers here -func ObjectFieldLocal(methodSugar bool, id *Identifier, params *Parameters, trailingComma bool, body Node) ObjectField { - return ObjectField{ObjectLocal, ObjectFieldVisible, false, methodSugar, nil, id, params, trailingComma, body, nil} -} - func ObjectFieldLocalNoMethod(id *Identifier, body Node) ObjectField { - return ObjectField{ObjectLocal, ObjectFieldVisible, false, false, nil, id, nil, false, body, nil} + return ObjectField{ObjectLocal, ObjectFieldVisible, false, false, nil, nil, id, nil, false, body, nil} } type ObjectFields []ObjectField diff --git a/ast/location.go b/ast/location.go index 9ace48a..84eff08 100644 --- a/ast/location.go +++ b/ast/location.go @@ -16,14 +16,22 @@ limitations under the License. package ast -import "fmt" +import ( + "bytes" + "fmt" +) + +type Source struct { + lines []string +} ////////////////////////////////////////////////////////////////////////////// // Location // Location represents a single location in an (unspecified) file. type Location struct { - Line int + Line int + // Column is a byte offset from the beginning of the line Column int } @@ -36,6 +44,13 @@ func (l *Location) String() string { return fmt.Sprintf("%v:%v", l.Line, l.Column) } +func locationBefore(a Location, b Location) bool { + if a.Line != b.Line { + return a.Line < b.Line + } + return a.Column < b.Column +} + ////////////////////////////////////////////////////////////////////////////// // LocationRange @@ -43,7 +58,15 @@ func (l *Location) String() string { type LocationRange struct { FileName string Begin Location - End Location + End Location // TODO(sbarzowski) inclusive? exclusive? a gap? + file *Source +} + +func LocationRangeBetween(a, b *LocationRange) LocationRange { + if a.file != b.file { + panic("Cannot create a LocationRange between different files") + } + return MakeLocationRange(a.FileName, a.file, a.Begin, b.End) } // IsSet returns if this LocationRange has been set. @@ -70,11 +93,101 @@ func (lr *LocationRange) String() string { return fmt.Sprintf("%s(%v)-(%v)", filePrefix, lr.Begin.String(), lr.End.String()) } +func (l *LocationRange) WithCode() bool { + return l.Begin.Line != 0 +} + // This is useful for special locations, e.g. manifestation entry point. func MakeLocationRangeMessage(msg string) LocationRange { return LocationRange{FileName: msg} } -func MakeLocationRange(fn string, begin Location, end Location) LocationRange { - return LocationRange{FileName: fn, Begin: begin, End: end} +func MakeLocationRange(fn string, fc *Source, begin Location, end Location) LocationRange { + return LocationRange{FileName: fn, file: fc, Begin: begin, End: end} +} + +type SourceProvider struct { +} + +func (sp *SourceProvider) GetSnippet(loc LocationRange) string { + var result bytes.Buffer + if loc.Begin.Line == 0 { + return "" + } + for i := loc.Begin.Line; i <= loc.End.Line; i++ { + inLineRange := trimToLine(loc, i) + for j := inLineRange.Begin.Column; j < inLineRange.End.Column; j++ { + result.WriteByte(loc.file.lines[i-1][j-1]) + } + if i != loc.End.Line { + result.WriteByte('\n') + } + } + return result.String() +} + +func BuildSource(s string) *Source { + var result []string + var lineBuf bytes.Buffer + for _, runeValue := range s { + lineBuf.WriteRune(runeValue) + if runeValue == '\n' { + result = append(result, lineBuf.String()) + lineBuf.Reset() + } + } + rest := lineBuf.String() + // Stuff after last end-of-line (EOF or some more code) + result = append(result, rest+"\n") + return &Source{result} +} + +func trimToLine(loc LocationRange, line int) LocationRange { + if loc.Begin.Line > line { + panic("invalid") + } + if loc.Begin.Line != line { + loc.Begin.Column = 1 + } + loc.Begin.Line = line + if loc.End.Line < line { + panic("invalid") + } + if loc.End.Line != line { + loc.End.Column = len(loc.file.lines[line-1]) + } + loc.End.Line = line + return loc +} + +// lineBeginning returns a part of the line directly before LocationRange +// for example: +// local x = foo() +// ^^^^^ <- LocationRange loc +// then +// local x = foo() +// ^^^^^^^^^^ <- lineBeginning(loc) +func LineBeginning(loc *LocationRange) LocationRange { + return LocationRange{ + Begin: Location{Line: loc.Begin.Line, Column: 1}, + End: loc.Begin, + FileName: loc.FileName, + file: loc.file, + } +} + +// lineEnding returns a part of the line directly after LocationRange +// for example: +// local x = foo() + test +// ^^^^^ <- LocationRange loc +// then +// local x = foo() + test +// ^^^^^^^ <- lineEnding(loc) +func LineEnding(loc *LocationRange) LocationRange { + return LocationRange{ + Begin: loc.End, + End: Location{Line: loc.End.Line, Column: len(loc.file.lines[loc.End.Line-1])}, + FileName: loc.FileName, + file: loc.file, + } } diff --git a/builtins.go b/builtins.go index 2ce2f94..9873948 100644 --- a/builtins.go +++ b/builtins.go @@ -608,7 +608,7 @@ type UnaryBuiltin struct { func getBuiltinEvaluator(e *evaluator, name ast.Identifier) *evaluator { loc := ast.MakeLocationRangeMessage("") - context := TraceContext{Name: "builtin function <" + string(name) + ">"} + context := "builtin function <" + string(name) + ">" trace := TraceElement{loc: &loc, context: &context} return &evaluator{i: e.i, trace: &trace} } diff --git a/desugarer.go b/desugarer.go index 60d6135..2bac874 100644 --- a/desugarer.go +++ b/desugarer.go @@ -128,22 +128,14 @@ func desugarFields(location ast.LocationRange, fields *ast.ObjectFields, objLeve field.Expr2 = assertion } - // Remove methods for i := range *fields { field := &((*fields)[i]) - if !field.MethodSugar { + if field.Method == nil { continue } - origBody := field.Expr2 - function := &ast.Function{ - // TODO(sbarzowski) better location - NodeBase: ast.NewNodeBaseLoc(*origBody.Loc()), - Parameters: *field.Params, - Body: origBody, - } - field.MethodSugar = false - field.Params = nil - field.Expr2 = function + field.Expr2 = field.Method + field.Method = nil + // Body of the function already desugared through expr2 } // Remove object-level locals @@ -483,19 +475,11 @@ func desugar(astPtr *ast.Node, objLevel int) (err error) { case *ast.Local: for i := range node.Binds { - if node.Binds[i].FunctionSugar { - origBody := node.Binds[i].Body - function := &ast.Function{ - // TODO(sbarzowski) better location - NodeBase: ast.NewNodeBaseLoc(*origBody.Loc()), - Parameters: *node.Binds[i].Params, - Body: origBody, - } + if node.Binds[i].Fun != nil { node.Binds[i] = ast.LocalBind{ - Variable: node.Binds[i].Variable, - Body: function, - FunctionSugar: false, - Params: nil, + Variable: node.Binds[i].Variable, + Body: node.Binds[i].Fun, + Fun: nil, } } err = desugar(&node.Binds[i].Body, objLevel) diff --git a/error_formatter.go b/error_formatter.go index 49472d9..51cd4f5 100644 --- a/error_formatter.go +++ b/error_formatter.go @@ -19,6 +19,7 @@ import ( "bytes" "fmt" + "github.com/fatih/color" "github.com/google/go-jsonnet/ast" "github.com/google/go-jsonnet/parser" ) @@ -27,10 +28,13 @@ type ErrorFormatter struct { // TODO(sbarzowski) use this // MaxStackTraceSize is the maximum length of stack trace before cropping MaxStackTraceSize int - // TODO(sbarzowski) use these + + // Examples of current state of the art. + // http://elm-lang.org/blog/compiler-errors-for-humans + // https://clang.llvm.org/diagnostics.html pretty bool colorful bool - SP SourceProvider + SP *ast.SourceProvider } func (ef *ErrorFormatter) format(err error) string { @@ -46,12 +50,13 @@ func (ef *ErrorFormatter) format(err error) string { func (ef *ErrorFormatter) formatRuntime(err *RuntimeError) string { return err.Error() + "\n" + ef.buildStackTrace(err.StackTrace) - // TODO(sbarzowski) pretty stuff } func (ef *ErrorFormatter) formatStatic(err *parser.StaticError) string { - return err.Error() + "\n" - // TODO(sbarzowski) pretty stuff + var buf bytes.Buffer + buf.WriteString(err.Error() + "\n") + ef.showCode(&buf, err.Loc) + return buf.String() } const bugURL = "https://github.com/google/go-jsonnet/issues" @@ -61,19 +66,42 @@ func (ef *ErrorFormatter) formatInternal(err error) string { "Please report a bug here: " + bugURL + "\n" } +func (ef *ErrorFormatter) showCode(buf *bytes.Buffer, loc ast.LocationRange) { + errFprintf := fmt.Fprintf + if ef.colorful { + errFprintf = color.New(color.FgRed).Fprintf + } + if loc.WithCode() { + // TODO(sbarzowski) include line numbers + // TODO(sbarzowski) underline errors instead of depending only on color + fmt.Fprintf(buf, "\n") + beginning := ast.LineBeginning(&loc) + ending := ast.LineEnding(&loc) + fmt.Fprintf(buf, "%v", ef.SP.GetSnippet(beginning)) + errFprintf(buf, "%v", ef.SP.GetSnippet(loc)) + fmt.Fprintf(buf, "%v", ef.SP.GetSnippet(ending)) + buf.WriteByte('\n') + } + fmt.Fprintf(buf, "\n") +} + func (ef *ErrorFormatter) buildStackTrace(frames []TraceFrame) string { // https://github.com/google/jsonnet/blob/master/core/libjsonnet.cpp#L594 var buf bytes.Buffer - for _, f := range frames { + for i := len(frames) - 1; i >= 0; i-- { + f := frames[i] + // TODO(sbarzowski) make pretty format more readable (it's already useful) + if ef.pretty { + fmt.Fprintf(&buf, "-------------------------------------------------\n") + } + // TODO(sbarzowski) tabs are probably a bad idea fmt.Fprintf(&buf, "\t%v\t%v\n", &f.Loc, f.Name) + if ef.pretty { + ef.showCode(&buf, f.Loc) + } + // TODO(sbarzowski) handle max stack trace size // TODO(sbarzowski) I think the order of frames is reversed } return buf.String() } - -type SourceProvider interface { - // TODO(sbarzowski) problem: locationRange.FileName may not necessarily - // uniquely identify a file. But this is the interface we want to have here. - getCode(ast.LocationRange) string -} diff --git a/evaluator.go b/evaluator.go index 3f29b88..0ffd0f0 100644 --- a/evaluator.go +++ b/evaluator.go @@ -162,11 +162,11 @@ func (e *evaluator) evaluateObject(pv potentialValue) (valueObject, error) { } func (e *evaluator) evalInCurrentContext(a ast.Node) (value, error) { - return e.i.evaluate(a, e.trace.context) + return e.i.evaluate(a) } -func (e *evaluator) evalInCleanEnv(newContext *TraceContext, env *environment, ast ast.Node) (value, error) { - return e.i.EvalInCleanEnv(e.trace, newContext, env, ast) +func (e *evaluator) evalInCleanEnv(env *environment, ast ast.Node) (value, error) { + return e.i.EvalInCleanEnv(e.trace, env, ast) } func (e *evaluator) lookUpVar(ident ast.Identifier) potentialValue { diff --git a/imports.go b/imports.go index 59c779b..3cff572 100644 --- a/imports.go +++ b/imports.go @@ -86,7 +86,7 @@ func codeToPV(e *evaluator, filename string, code string) potentialValue { // The same thinking applies to external variables. return makeErrorThunk(err) } - return makeThunk("_", e.i.initialEnv, node) + return makeThunk(e.i.initialEnv, node) } func (cache *ImportCache) ImportCode(codeDir, importedPath string, e *evaluator) (value, error) { diff --git a/interpreter.go b/interpreter.go index 45cd574..fa24ea0 100644 --- a/interpreter.go +++ b/interpreter.go @@ -71,7 +71,7 @@ type callFrame struct { // This makes callFrame a misnomer as it is technically not always a call... isCall bool - // Tracing information about the place where (TODO) + // Tracing information about the place where it was called from. trace *TraceElement /** Reuse this stack frame for the purpose of tail call optimization. */ @@ -242,11 +242,11 @@ func (i *interpreter) getCurrentEnv(ast ast.Node) environment { ) } -func (i *interpreter) evaluate(a ast.Node, context *TraceContext) (value, error) { +func (i *interpreter) evaluate(a ast.Node) (value, error) { e := &evaluator{ trace: &TraceElement{ loc: a.Loc(), - context: context, + context: a.Context(), }, i: i, } @@ -257,7 +257,7 @@ func (i *interpreter) evaluate(a ast.Node, context *TraceContext) (value, error) var elements []potentialValue for _, el := range ast.Elements { env := makeEnvironment(i.capture(el.FreeVariables()), sb) - elThunk := makeThunk("array_element", env, el) + elThunk := makeThunk(env, el) elements = append(elements, elThunk) } return makeValueArray(elements), nil @@ -269,8 +269,8 @@ func (i *interpreter) evaluate(a ast.Node, context *TraceContext) (value, error) // TODO(sbarzowski) it may make sense not to show a line in stack trace for operators // at all in many cases. 1 + 2 + 3 + 4 + error "x" will show 5 lines // of stack trace now, and it's not that nice. - left := makeThunk("x", env, ast.Left) - right := makeThunk("y", env, ast.Right) + left := makeThunk(env, ast.Left) + right := makeThunk(env, ast.Right) builtin := bopBuiltins[ast.Op] @@ -282,7 +282,7 @@ func (i *interpreter) evaluate(a ast.Node, context *TraceContext) (value, error) case *ast.Unary: env := i.getCurrentEnv(ast) - arg := makeThunk("x", env, ast.Expr) + arg := makeThunk(env, ast.Expr) builtin := uopBuiltins[ast.Op] @@ -401,7 +401,7 @@ func (i *interpreter) evaluate(a ast.Node, context *TraceContext) (value, error) vars := make(bindingFrame) bindEnv := i.getCurrentEnv(a) for _, bind := range ast.Binds { - th := makeThunk(bind.Variable, bindEnv, bind.Body) + th := makeThunk(bindEnv, bind.Body) // recursive locals vars[bind.Variable] = th @@ -467,8 +467,7 @@ func (i *interpreter) evaluate(a ast.Node, context *TraceContext) (value, error) positional: make([]potentialValue, len(ast.Arguments.Positional)), } for i, arg := range ast.Arguments.Positional { - // TODO(sbarzowski) better thunk name - arguments.positional[i] = makeThunk("arg", argEnv, arg) + arguments.positional[i] = makeThunk(argEnv, arg) } return e.evaluate(function.call(arguments)) @@ -700,13 +699,12 @@ func (i *interpreter) manifestAndSerializeJSON(trace *TraceElement, v value, mul return buf.String(), nil } -func (i *interpreter) EvalInCleanEnv(fromWhere *TraceElement, newContext *TraceContext, - env *environment, ast ast.Node) (value, error) { +func (i *interpreter) EvalInCleanEnv(fromWhere *TraceElement, env *environment, ast ast.Node) (value, error) { err := i.newCall(fromWhere, *env) if err != nil { return nil, err } - val, err := i.evaluate(ast, newContext) + val, err := i.evaluate(ast) i.stack.pop() return val, err } @@ -736,12 +734,11 @@ func evaluateStd(i *interpreter) (value, error) { ) evalLoc := ast.MakeLocationRangeMessage("During evaluation of std") evalTrace := &TraceElement{loc: &evalLoc} - node, err := snippetToAST("std.jsonnet", getStdCode()) + node, err := snippetToAST("", getStdCode()) if err != nil { return nil, err } - context := TraceContext{Name: ""} - return i.EvalInCleanEnv(evalTrace, &context, &beforeStdEnv, node) + return i.EvalInCleanEnv(evalTrace, &beforeStdEnv, node) } func prepareExtVars(i *interpreter, ext vmExtMap) map[ast.Identifier]potentialValue { @@ -796,8 +793,7 @@ func evaluate(node ast.Node, ext vmExtMap, maxStack int, importer Importer) (str evalTrace := &TraceElement{ loc: &evalLoc, } - context := TraceContext{Name: "
"} - result, err := i.EvalInCleanEnv(evalTrace, &context, &i.initialEnv, node) + result, err := i.EvalInCleanEnv(evalTrace, &i.initialEnv, node) if err != nil { return "", err } diff --git a/main_test.go b/main_test.go index 1f94d8b..dbb7755 100644 --- a/main_test.go +++ b/main_test.go @@ -92,6 +92,7 @@ func TestMain(t *testing.T) { } mainTests = append(mainTests, mainTest{name: name, input: input, golden: golden}) } + errFormatter := ErrorFormatter{pretty: true} for _, test := range mainTests { t.Run(test.name, func(t *testing.T) { vm := MakeVM() @@ -109,7 +110,7 @@ func TestMain(t *testing.T) { if err != nil { // TODO(sbarzowski) perhaps somehow mark that we are processing // an error. But for now we can treat them the same. - output = err.Error() + output = errFormatter.format(err) } output += "\n" if *update { @@ -188,19 +189,20 @@ func TestOneLineError(t *testing.T) { // TODO(sbarzowski) checking if the whitespace is right is quite unpleasant, what can we do about it? var minimalErrorTests = []errorFormattingTest{ {"error", `error "x"`, "RUNTIME ERROR: x\n" + + " error:1:1-9 $\n" + // TODO(sbarzowski) if seems we have off-by-one in location " During evaluation \n" + - " error:1:1-9
\n"}, // TODO(sbarzowski) if seems we have off-by-one in location + ""}, {"error_in_func", `local x(n) = if n == 0 then error "x" else x(n - 1); x(3)`, "RUNTIME ERROR: x\n" + + " error_in_func:1:29-37 function \n" + + " error_in_func:1:44-52 function \n" + + " error_in_func:1:44-52 function \n" + + " error_in_func:1:44-52 function \n" + + " error_in_func:1:54-58 $\n" + " During evaluation \n" + - " error_in_func:1:54-58
\n" + - " error_in_func:1:44-52 function \n" + - " error_in_func:1:44-52 function \n" + - " error_in_func:1:44-52 function \n" + - " error_in_func:1:29-37 function \n" + ""}, {"error_in_error", `error (error "x")`, "RUNTIME ERROR: x\n" + + " error_in_error:1:8-16 $\n" + " During evaluation \n" + - " error_in_error:1:8-16
\n" + ""}, } @@ -210,3 +212,6 @@ func TestMinimalError(t *testing.T) { return formatter.format(r) }) } + +// TODO(sbarzowski) test pretty errors once they are stable-ish +// probably "golden" pattern is the right one for that diff --git a/parser/context.go b/parser/context.go new file mode 100644 index 0000000..4bff536 --- /dev/null +++ b/parser/context.go @@ -0,0 +1,371 @@ +/* +Copyright 2017 Google Inc. All rights reserved. + +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 parser + +import ( + "fmt" + + "github.com/google/go-jsonnet/ast" +) + +var topLevelContext = "$" + +const anonymous = "anonymous" + +// TODO(sbarzowski) polish children functions and consider moving to AST +// and exporting + +// directChildren are children of AST node that are executed in the same context +// and environment as their parent +// +// They must satisfy the following rules: +// * (no-delayed-evaluation) They are evaluated when their parent is evaluated or never. +// * (no-indirect-evaluation) They cannot be evaluated during evaluation of any non-direct children +// * (same-environment) They must be evaluated in the same environment as their parent +func directChildren(node ast.Node) []ast.Node { + switch node := node.(type) { + case *ast.Apply: + return []ast.Node{node.Target} + // TODO(sbarzowski) tailstrict call arguments (once we have tailstrict) + case *ast.ApplyBrace: + return []ast.Node{node.Left, node.Right} + case *ast.Array: + return nil + case *ast.Assert: + return []ast.Node{node.Cond, node.Message, node.Rest} + case *ast.Binary: + return []ast.Node{node.Left, node.Right} + case *ast.Conditional: + return []ast.Node{node.Cond, node.BranchTrue, node.BranchFalse} + case *ast.Dollar: + return nil + case *ast.Error: + return []ast.Node{node.Expr} + case *ast.Function: + return nil + case *ast.Import: + return nil + case *ast.ImportStr: + return nil + case *ast.Index: + return []ast.Node{node.Target, node.Index} + case *ast.Slice: + return []ast.Node{node.Target, node.BeginIndex, node.EndIndex, node.Step} + case *ast.Local: + return []ast.Node{node.Body} + case *ast.LiteralBoolean: + return nil + case *ast.LiteralNull: + return nil + case *ast.LiteralNumber: + return nil + case *ast.LiteralString: + return nil + case *ast.Object: + return objectFieldsDirectChildren(node.Fields) + case *ast.ArrayComp: + result := []ast.Node{} + spec := &node.Spec + for spec != nil { + result = append(result, spec.Expr) + for _, ifspec := range spec.Conditions { + result = append(result, ifspec.Expr) + } + spec = spec.Outer + } + return result + case *ast.ObjectComp: + result := objectFieldsDirectChildren(node.Fields) + spec := &node.Spec + for spec != nil { + result = append(result, spec.Expr) + for _, ifspec := range spec.Conditions { + result = append(result, ifspec.Expr) + } + spec = spec.Outer + } + return result + case *ast.Self: + return nil + case *ast.SuperIndex: + return []ast.Node{node.Index} + case *ast.InSuper: + return []ast.Node{node.Index} + case *ast.Unary: + return []ast.Node{node.Expr} + case *ast.Var: + return nil + } + panic(fmt.Sprintf("directChildren: Unknown node %#v", node)) +} + +// thunkChildren are children of AST node that are executed in a new context +// and capture environment from parent (thunked) +// TODO(sbarzowski) Make sure it works well with boundary cases like tailstrict arguments, +// make it more precise. +// Rules: +// * (same-environment) They must be evaluated in the same environment as their parent +// * (not-direct) If they can be direct children, they should (and cannot be thunked). +func thunkChildren(node ast.Node) []ast.Node { + switch node := node.(type) { + case *ast.Apply: + var nodes []ast.Node + for _, arg := range node.Arguments.Positional { + nodes = append(nodes, arg) + } + for _, arg := range node.Arguments.Named { + nodes = append(nodes, arg.Arg) + } + return nodes + case *ast.ApplyBrace: + return nil + case *ast.Array: + return node.Elements + case *ast.Assert: + return nil + case *ast.Binary: + return nil + case *ast.Conditional: + return nil + case *ast.Dollar: + return nil + case *ast.Error: + return nil + case *ast.Function: + return nil + case *ast.Import: + return nil + case *ast.ImportStr: + return nil + case *ast.Index: + return nil + case *ast.Slice: + return nil + case *ast.Local: + // TODO(sbarzowski) complicated + return nil + case *ast.LiteralBoolean: + return nil + case *ast.LiteralNull: + return nil + case *ast.LiteralNumber: + return nil + case *ast.LiteralString: + return nil + case *ast.Object: + return nil + case *ast.ArrayComp: + return []ast.Node{node.Body} + case *ast.ObjectComp: + return nil + case *ast.Self: + return nil + case *ast.SuperIndex: + return nil + case *ast.InSuper: + return nil + case *ast.Unary: + return nil + case *ast.Var: + return nil + } + panic(fmt.Sprintf("thunkChildren: Unknown node %#v", node)) +} + +func objectFieldsDirectChildren(fields ast.ObjectFields) ast.Nodes { + result := ast.Nodes{} + for _, field := range fields { + if field.Expr1 != nil { + result = append(result, field.Expr1) + } + } + return result +} + +func inObjectFieldsChildren(fields ast.ObjectFields) ast.Nodes { + result := ast.Nodes{} + for _, field := range fields { + if field.MethodSugar { + result = append(result, field.Method) + } else { + if field.Expr2 != nil { + result = append(result, field.Expr2) + } + if field.Expr3 != nil { + result = append(result, field.Expr3) + } + } + } + return result +} + +// children that are neither direct nor thunked, e.g. object field body +// They are evaluated in a different environment from their parent. +func specialChildren(node ast.Node) []ast.Node { + switch node := node.(type) { + case *ast.Apply: + return nil + case *ast.ApplyBrace: + return nil + case *ast.Array: + return nil + case *ast.Assert: + return nil + case *ast.Binary: + return nil + case *ast.Conditional: + return nil + case *ast.Dollar: + return nil + case *ast.Error: + return nil + case *ast.Function: + // TODO(sbarzowski) this + return nil + case *ast.Import: + return nil + case *ast.ImportStr: + return nil + case *ast.Index: + return nil + case *ast.Slice: + return nil + case *ast.Local: + return nil + case *ast.LiteralBoolean: + return nil + case *ast.LiteralNull: + return nil + case *ast.LiteralNumber: + return nil + case *ast.LiteralString: + return nil + case *ast.Object: + return inObjectFieldsChildren(node.Fields) + case *ast.ArrayComp: + return []ast.Node{node.Body} + case *ast.ObjectComp: + + case *ast.Self: + return nil + case *ast.SuperIndex: + return nil + case *ast.InSuper: + return nil + case *ast.Unary: + return nil + case *ast.Var: + return nil + } + panic(fmt.Sprintf("specialChildren: Unknown node %#v", node)) +} + +func children(node ast.Node) []ast.Node { + var result []ast.Node + result = append(result, directChildren(node)...) + result = append(result, thunkChildren(node)...) + result = append(result, specialChildren(node)...) + return result +} + +func functionContext(funcName string) *string { + r := "function <" + funcName + ">" + return &r +} + +func objectContext(objName string) *string { + r := "object <" + objName + ">" + return &r +} + +// addContext adds context to a node and its whole subtree. +// +// context is the surrounding context of a node (e.g. a function it's in) +// +// bind is a name that the node is bound to, i.e. if node is a local bind body +// then bind is its name. For nodes that are not bound to variables `anonymous` +// should be passed. For example: +// local x = 2 + 2; x +// In such case bind for binary node 2 + 2 is "x" and for every other node, +// including its children, its anonymous. +func addContext(node ast.Node, context *string, bind string) { + if node == nil { + return + } + + node.SetContext(context) + + switch node := node.(type) { + case *ast.Function: + funContext := functionContext(bind) + addContext(node.Body, funContext, anonymous) + for i := range node.Parameters.Named { + // Default arguments have the same context as the function body. + addContext(node.Parameters.Named[i].DefaultArg, funContext, anonymous) + } + case *ast.Object: + // TODO(sbarzowski) include fieldname, maybe even chains + + outOfObject := directChildren(node) + for _, f := range outOfObject { + // This actually is evaluated outside of object + addContext(f, context, anonymous) + } + + objContext := objectContext(bind) + inObject := inObjectFieldsChildren(node.Fields) + for _, f := range inObject { + // This actually is evaluated outside of object + addContext(f, objContext, anonymous) + } + + case *ast.ObjectComp: + outOfObject := directChildren(node) + for _, f := range outOfObject { + // This actually is evaluated outside of object + addContext(f, context, anonymous) + } + + objContext := objectContext(bind) + inObject := inObjectFieldsChildren(node.Fields) + for _, f := range inObject { + // This actually is evaluated outside of object + addContext(f, objContext, anonymous) + } + + case *ast.Local: + for _, bind := range node.Binds { + namedThunkContext := "thunk <" + string(bind.Variable) + "> from <" + *context + ">" + if bind.Fun != nil { + addContext(bind.Fun, &namedThunkContext, string(bind.Variable)) + } else { + addContext(bind.Body, &namedThunkContext, string(bind.Variable)) + } + } + addContext(node.Body, context, bind) + default: + for _, child := range directChildren(node) { + addContext(child, context, anonymous) + } + + // TODO(sbarzowski) avoid "thunk from " + for _, child := range thunkChildren(node) { + addContext(child, &thunkContext, anonymous) + } + } +} diff --git a/parser/lexer.go b/parser/lexer.go index 785fa5d..7897df8 100644 --- a/parser/lexer.go +++ b/parser/lexer.go @@ -245,6 +245,7 @@ type position struct { type lexer struct { fileName string // The file name being lexed, only used for errors input string // The input string + source *ast.Source pos position // Current position in input prev position // Previous position in input @@ -263,6 +264,7 @@ func makeLexer(fn string, input string) *lexer { return &lexer{ fileName: fn, input: input, + source: ast.BuildSource(input), pos: position{byteNo: 0, lineNo: 1, lineStart: 0}, prev: position{byteNo: lexEOF, lineNo: 0, lineStart: 0}, tokenStartLoc: ast.Location{Line: 1, Column: 1}, @@ -337,7 +339,7 @@ func (l *lexer) emitFullToken(kind tokenKind, data, stringBlockIndent, stringBlo data: data, stringBlockIndent: stringBlockIndent, stringBlockTermIndent: stringBlockTermIndent, - loc: ast.MakeLocationRange(l.fileName, l.tokenStartLoc, l.location()), + loc: ast.MakeLocationRange(l.fileName, l.source, l.tokenStartLoc, l.location()), }) l.fodder = fodder{} } @@ -367,6 +369,10 @@ func (l *lexer) addFodder(kind fodderKind, data string) { l.fodder = append(l.fodder, fodderElement{kind: kind, data: data}) } +func (l *lexer) makeStaticErrorPoint(msg string, loc ast.Location) StaticError { + return StaticError{Msg: msg, Loc: ast.MakeLocationRange(l.fileName, l.source, loc, loc)} +} + // lexNumber will consume a number and emit a token. It is assumed // that the next rune to be served by the lexer will be a leading digit. func (l *lexer) lexNumber() error { @@ -431,9 +437,9 @@ outerLoop: case r >= '0' && r <= '9': state = numAfterDigit default: - return MakeStaticErrorPoint( + return l.makeStaticErrorPoint( fmt.Sprintf("Couldn't lex number, junk after decimal point: %v", strconv.QuoteRuneToASCII(r)), - l.fileName, l.prevLocation()) + l.prevLocation()) } case numAfterDigit: switch { @@ -451,17 +457,17 @@ outerLoop: case r >= '0' && r <= '9': state = numAfterExpDigit default: - return MakeStaticErrorPoint( + return l.makeStaticErrorPoint( fmt.Sprintf("Couldn't lex number, junk after 'E': %v", strconv.QuoteRuneToASCII(r)), - l.fileName, l.prevLocation()) + l.prevLocation()) } case numAfterExpSign: if r >= '0' && r <= '9' { state = numAfterExpDigit } else { - return MakeStaticErrorPoint( + return l.makeStaticErrorPoint( fmt.Sprintf("Couldn't lex number, junk after exponent sign: %v", strconv.QuoteRuneToASCII(r)), - l.fileName, l.prevLocation()) + l.prevLocation()) } case numAfterExpDigit: @@ -558,8 +564,8 @@ func (l *lexer) lexSymbol() error { l.resetTokenStart() // Throw out the leading /* for r = l.next(); ; r = l.next() { if r == lexEOF { - return MakeStaticErrorPoint("Multi-line comment has no terminating */", - l.fileName, commentStartLoc) + return l.makeStaticErrorPoint("Multi-line comment has no terminating */", + commentStartLoc) } if r == '*' && l.peek() == '/' { commentData := l.input[l.tokenStart : l.pos.byteNo-1] // Don't include trailing */ @@ -584,8 +590,8 @@ func (l *lexer) lexSymbol() error { numWhiteSpace := checkWhitespace(l.input[l.pos.byteNo:], l.input[l.pos.byteNo:]) stringBlockIndent := l.input[l.pos.byteNo : l.pos.byteNo+numWhiteSpace] if numWhiteSpace == 0 { - return MakeStaticErrorPoint("Text block's first line must start with whitespace", - l.fileName, commentStartLoc) + return l.makeStaticErrorPoint("Text block's first line must start with whitespace", + commentStartLoc) } for { @@ -595,8 +601,7 @@ func (l *lexer) lexSymbol() error { l.acceptN(numWhiteSpace) for r = l.next(); r != '\n'; r = l.next() { if r == lexEOF { - return MakeStaticErrorPoint("Unexpected EOF", - l.fileName, commentStartLoc) + return l.makeStaticErrorPoint("Unexpected EOF", commentStartLoc) } cb.WriteRune(r) } @@ -618,8 +623,7 @@ func (l *lexer) lexSymbol() error { } l.backup() if !strings.HasPrefix(l.input[l.pos.byteNo:], "|||") { - return MakeStaticErrorPoint("Text block not terminated with |||", - l.fileName, commentStartLoc) + return l.makeStaticErrorPoint("Text block not terminated with |||", commentStartLoc) } l.acceptN(3) // Skip '|||' l.emitFullToken(tokenStringBlock, cb.String(), @@ -710,7 +714,7 @@ func Lex(fn string, input string) (tokens, error) { l.resetTokenStart() // Don't include the quotes in the token data for r = l.next(); ; r = l.next() { if r == lexEOF { - return nil, MakeStaticErrorPoint("Unterminated String", l.fileName, stringStartLoc) + return nil, l.makeStaticErrorPoint("Unterminated String", stringStartLoc) } if r == '"' { l.backup() @@ -728,7 +732,7 @@ func Lex(fn string, input string) (tokens, error) { l.resetTokenStart() // Don't include the quotes in the token data for r = l.next(); ; r = l.next() { if r == lexEOF { - return nil, MakeStaticErrorPoint("Unterminated String", l.fileName, stringStartLoc) + return nil, l.makeStaticErrorPoint("Unterminated String", stringStartLoc) } if r == '\'' { l.backup() @@ -757,15 +761,14 @@ func Lex(fn string, input string) (tokens, error) { } else if quot == '\'' { kind = tokenVerbatimStringSingle } else { - return nil, MakeStaticErrorPoint( + return nil, l.makeStaticErrorPoint( fmt.Sprintf("Couldn't lex verbatim string, junk after '@': %v", quot), - l.fileName, stringStartLoc, ) } for r = l.next(); ; r = l.next() { if r == lexEOF { - return nil, MakeStaticErrorPoint("Unterminated String", l.fileName, stringStartLoc) + return nil, l.makeStaticErrorPoint("Unterminated String", stringStartLoc) } else if r == quot { if l.peek() == quot { l.next() @@ -799,9 +802,9 @@ func Lex(fn string, input string) (tokens, error) { return nil, err } } else { - return nil, MakeStaticErrorPoint( + return nil, l.makeStaticErrorPoint( fmt.Sprintf("Could not lex the character %s", strconv.QuoteRuneToASCII(r)), - l.fileName, l.prevLocation()) + l.prevLocation()) } } diff --git a/parser/parser.go b/parser/parser.go index 62f5141..e98337f 100644 --- a/parser/parser.go +++ b/parser/parser.go @@ -61,11 +61,11 @@ func makeUnexpectedError(t *token, while string) error { } func locFromTokens(begin, end *token) ast.LocationRange { - return ast.MakeLocationRange(begin.loc.FileName, begin.loc.Begin, end.loc.End) + return ast.LocationRangeBetween(&begin.loc, &end.loc) } func locFromTokenAST(begin *token, end ast.Node) ast.LocationRange { - return ast.MakeLocationRange(begin.loc.FileName, begin.loc.Begin, end.Loc().End) + return ast.LocationRangeBetween(&begin.loc, end.Loc()) } // --------------------------------------------------------------------------- @@ -219,36 +219,36 @@ func (p *parser) parseBind(binds *ast.LocalBinds) error { } } + var fun *ast.Function if p.peek().kind == tokenParenL { p.pop() params, gotComma, err := p.parseParameters("function parameter") if err != nil { return err } - _, err = p.popExpectOp("=") - if err != nil { - return err - } - body, err := p.parse(maxPrecedence) - if err != nil { - return err - } - *binds = append(*binds, ast.LocalBind{ - Variable: ast.Identifier(varID.data), - Body: body, - FunctionSugar: true, - Params: params, + fun = &ast.Function{ + Parameters: *params, TrailingComma: gotComma, + } + } + + _, err = p.popExpectOp("=") + if err != nil { + return err + } + body, err := p.parse(maxPrecedence) + if err != nil { + return err + } + + if fun != nil { + fun.Body = body + *binds = append(*binds, ast.LocalBind{ + Variable: ast.Identifier(varID.data), + Body: body, + Fun: fun, }) } else { - _, err = p.popExpectOp("=") - if err != nil { - return err - } - body, err := p.parse(maxPrecedence) - if err != nil { - return err - } *binds = append(*binds, ast.LocalBind{ Variable: ast.Identifier(varID.data), Body: body, @@ -299,6 +299,7 @@ func (p *parser) parseObjectAssignmentOp() (plusSugar bool, hide ast.ObjectField // +gen set type LiteralField string +// Parse object or object comprehension without leading brace func (p *parser) parseObjectRemainder(tok *token) (ast.Node, *token, error) { var fields ast.ObjectFields literalFields := make(literalFieldSet) @@ -451,11 +452,21 @@ func (p *parser) parseObjectRemainder(tok *token) (ast.Node, *token, error) { return nil, nil, err } + var method *ast.Function + if isMethod { + method = &ast.Function{ + Parameters: *params, + TrailingComma: methComma, + Body: body, + } + } + fields = append(fields, ast.ObjectField{ Kind: kind, Hide: hide, SuperSugar: plusSugar, MethodSugar: isMethod, + Method: method, Expr1: expr1, Id: id, Params: params, @@ -475,6 +486,8 @@ func (p *parser) parseObjectRemainder(tok *token) (ast.Node, *token, error) { return nil, nil, MakeStaticError(fmt.Sprintf("Duplicate local var: %v", id), varID.loc) } + // TODO(sbarzowski) Can we reuse regular local bind parsing here? + isMethod := false funcComma := false var params *ast.Parameters @@ -496,6 +509,15 @@ func (p *parser) parseObjectRemainder(tok *token) (ast.Node, *token, error) { return nil, nil, err } + var method *ast.Function + if isMethod { + method = &ast.Function{ + Parameters: *params, + TrailingComma: funcComma, + Body: body, + } + } + binds.Add(id) fields = append(fields, ast.ObjectField{ @@ -503,6 +525,7 @@ func (p *parser) parseObjectRemainder(tok *token) (ast.Node, *token, error) { Hide: ast.ObjectFieldVisible, SuperSugar: false, MethodSugar: isMethod, + Method: method, Id: &id, Params: params, TrailingComma: funcComma, @@ -1165,5 +1188,7 @@ func Parse(t tokens) (ast.Node, error) { return nil, MakeStaticError(fmt.Sprintf("Did not expect: %v", p.peek()), p.peek().loc) } + addContext(expr, &topLevelContext, anonymous) + return expr, nil } diff --git a/parser/parser_test.go b/parser/parser_test.go index d45c33b..8d3f3f7 100644 --- a/parser/parser_test.go +++ b/parser/parser_test.go @@ -16,6 +16,7 @@ limitations under the License. package parser import ( + "fmt" "testing" ) @@ -124,15 +125,19 @@ var tests = []string{ func TestParser(t *testing.T) { for _, s := range tests { - tokens, err := Lex("test", s) - if err != nil { - t.Errorf("Unexpected lex error\n input: %v\n error: %v", s, err) - continue - } - _, err = Parse(tokens) - if err != nil { - t.Errorf("Unexpected parse error\n input: %v\n error: %v", s, err) - } + t.Run(s, func(t *testing.T) { + fmt.Println(s) + tokens, err := Lex("test", s) + if err != nil { + t.Errorf("Unexpected lex error\n input: %v\n error: %v", s, err) + return + } + _, err = Parse(tokens) + if err != nil { + t.Errorf("Unexpected parse error\n input: %v\n error: %v", s, err) + } + }) + } } @@ -246,19 +251,21 @@ var errorTests = []testError{ func TestParserErrors(t *testing.T) { for _, s := range errorTests { - tokens, err := Lex("test", s.input) - if err != nil { - t.Errorf("Unexpected lex error\n input: %v\n error: %v", s.input, err) - continue - } - _, err = Parse(tokens) - if err == nil { - t.Errorf("Expected parse error but got success\n input: %v", s.input) - continue - } - if err.Error() != s.err { - t.Errorf("Error string not as expected\n input: %v\n expected error: %v\n actual error: %v", s.input, s.err, err.Error()) - } + t.Run(s.input, func(t *testing.T) { + tokens, err := Lex("test", s.input) + if err != nil { + t.Errorf("Unexpected lex error\n input: %v\n error: %v", s.input, err) + return + } + _, err = Parse(tokens) + if err == nil { + t.Errorf("Expected parse error but got success\n input: %v", s.input) + return + } + if err.Error() != s.err { + t.Errorf("Error string not as expected\n input: %v\n expected error: %v\n actual error: %v", s.input, s.err, err.Error()) + } + }) } } diff --git a/parser/static_error.go b/parser/static_error.go index 9a826ae..c74edbb 100644 --- a/parser/static_error.go +++ b/parser/static_error.go @@ -36,10 +36,6 @@ func MakeStaticErrorMsg(msg string) StaticError { return StaticError{Msg: msg} } -func MakeStaticErrorPoint(msg string, fn string, l ast.Location) StaticError { - return StaticError{Msg: msg, Loc: ast.MakeLocationRange(fn, l, l)} -} - func MakeStaticError(msg string, lr ast.LocationRange) StaticError { return StaticError{Msg: msg, Loc: lr} } diff --git a/runtime_error.go b/runtime_error.go index dac5409..1b14b63 100644 --- a/runtime_error.go +++ b/runtime_error.go @@ -48,20 +48,15 @@ func traceElementToTraceFrame(trace *TraceElement) TraceFrame { tf := TraceFrame{Loc: *trace.loc} if trace.context != nil { // TODO(sbarzowski) maybe it should never be nil - tf.Name = trace.context.Name + tf.Name = *trace.context } else { tf.Name = "" } return tf } -type TraceContext struct { - // Human readable name - e.g. function - Name string -} - // TODO(sbarzowski) better name type TraceElement struct { loc *ast.LocationRange - context *TraceContext + context ast.Context } diff --git "a/testdata/\".golden" "b/testdata/\".golden" index 4f12b35..c6e34c6 100644 --- "a/testdata/\".golden" +++ "b/testdata/\".golden" @@ -1 +1,5 @@ testdata/":2:1 Unexpected end of file. + + + + diff --git a/testdata/'.golden b/testdata/'.golden index a4592f4..6d7b651 100644 --- a/testdata/'.golden +++ b/testdata/'.golden @@ -1 +1,5 @@ testdata/':2:1 Unexpected end of file. + + + + diff --git a/testdata/arrcomp5.golden b/testdata/arrcomp5.golden index 5bbe24c..2551a06 100644 --- a/testdata/arrcomp5.golden +++ b/testdata/arrcomp5.golden @@ -1 +1,5 @@ testdata/arrcomp5:1:14-15 Unknown variable: x + +[y for y in [x + 1] for x in [1, 2, 3]] + + diff --git a/testdata/arrcomp_if4.golden b/testdata/arrcomp_if4.golden index 6e925c4..87b2723 100644 --- a/testdata/arrcomp_if4.golden +++ b/testdata/arrcomp_if4.golden @@ -1 +1,5 @@ testdata/arrcomp_if4:1:33-34 Unknown variable: y + +[[x, y] for x in [1,2,3,4,5] if y == 3 for y in [1,2,3,4,5]] + + diff --git a/testdata/arrcomp_if6.golden b/testdata/arrcomp_if6.golden index 57d4eaa..d278138 100644 --- a/testdata/arrcomp_if6.golden +++ b/testdata/arrcomp_if6.golden @@ -1 +1,13 @@ RUNTIME ERROR: x +------------------------------------------------- + testdata/arrcomp_if6:1:20-28 $ + +[x for x in [1] if error "x"] + +------------------------------------------------- + builtin function + +------------------------------------------------- + During evaluation + + diff --git a/testdata/arrcomp_if7.golden b/testdata/arrcomp_if7.golden index ce87f7c..f28671d 100644 --- a/testdata/arrcomp_if7.golden +++ b/testdata/arrcomp_if7.golden @@ -1 +1,11 @@ RUNTIME ERROR: Unexpected type number, expected boolean +------------------------------------------------- + + +------------------------------------------------- + builtin function + +------------------------------------------------- + During evaluation + + diff --git a/testdata/assert3.golden b/testdata/assert3.golden index 57b9b74..eeb934a 100644 --- a/testdata/assert3.golden +++ b/testdata/assert3.golden @@ -1 +1,8 @@ RUNTIME ERROR: Assertion failed +------------------------------------------------- + + +------------------------------------------------- + During evaluation + + diff --git a/testdata/assert_equal4.golden b/testdata/assert_equal4.golden index 58b72ac..bc3e2e7 100644 --- a/testdata/assert_equal4.golden +++ b/testdata/assert_equal4.golden @@ -1 +1,15 @@ RUNTIME ERROR: Assertion failed. {"x": 1} != {"x": 2} +------------------------------------------------- + :649:13-56 function + + error "Assertion failed. " + a + " != " + b, + +------------------------------------------------- + testdata/assert_equal4:1:1-32 $ + +std.assertEqual({x: 1}, {x: 2}) + +------------------------------------------------- + During evaluation + + diff --git a/testdata/assert_equal5.golden b/testdata/assert_equal5.golden new file mode 100644 index 0000000..2cd92a1 --- /dev/null +++ b/testdata/assert_equal5.golden @@ -0,0 +1,17 @@ +RUNTIME ERROR: Assertion failed. + != + +------------------------------------------------- + :649:13-56 function + + error "Assertion failed. " + a + " != " + b, + +------------------------------------------------- + testdata/assert_equal5:1:1-29 $ + +std.assertEqual("\n ", "\n") + +------------------------------------------------- + During evaluation + + diff --git a/testdata/assert_equal5.jsonnet b/testdata/assert_equal5.jsonnet new file mode 100644 index 0000000..00cab54 --- /dev/null +++ b/testdata/assert_equal5.jsonnet @@ -0,0 +1 @@ +std.assertEqual("\n ", "\n") diff --git a/testdata/assert_equal6.golden b/testdata/assert_equal6.golden new file mode 100644 index 0000000..0a98e83 --- /dev/null +++ b/testdata/assert_equal6.golden @@ -0,0 +1,15 @@ +RUNTIME ERROR: Assertion failed.  != +------------------------------------------------- + :649:13-56 function + + error "Assertion failed. " + a + " != " + b, + +------------------------------------------------- + testdata/assert_equal6:1:1-34 $ + +std.assertEqual("\u001b[31m", "") + +------------------------------------------------- + During evaluation + + diff --git a/testdata/assert_equal6.jsonnet b/testdata/assert_equal6.jsonnet new file mode 100644 index 0000000..f1086db --- /dev/null +++ b/testdata/assert_equal6.jsonnet @@ -0,0 +1 @@ +std.assertEqual("\u001b[31m", "") diff --git a/testdata/assert_failed.golden b/testdata/assert_failed.golden index 57b9b74..eeb934a 100644 --- a/testdata/assert_failed.golden +++ b/testdata/assert_failed.golden @@ -1 +1,8 @@ RUNTIME ERROR: Assertion failed +------------------------------------------------- + + +------------------------------------------------- + During evaluation + + diff --git a/testdata/assert_failed_custom.golden b/testdata/assert_failed_custom.golden index 6755f2a..23cefc5 100644 --- a/testdata/assert_failed_custom.golden +++ b/testdata/assert_failed_custom.golden @@ -1 +1,8 @@ RUNTIME ERROR: Custom Message +------------------------------------------------- + + +------------------------------------------------- + During evaluation + + diff --git a/testdata/bad_function_call.golden b/testdata/bad_function_call.golden index 7ec1af3..4aaa7d3 100644 --- a/testdata/bad_function_call.golden +++ b/testdata/bad_function_call.golden @@ -1 +1,10 @@ RUNTIME ERROR: function expected 1 argument(s), but got 0 +------------------------------------------------- + testdata/bad_function_call:1:1-18 $ + +(function(x) x)() + +------------------------------------------------- + During evaluation + + diff --git a/testdata/bad_function_call2.golden b/testdata/bad_function_call2.golden index 83f8a45..3af428b 100644 --- a/testdata/bad_function_call2.golden +++ b/testdata/bad_function_call2.golden @@ -1 +1,10 @@ RUNTIME ERROR: function expected 1 argument(s), but got 2 +------------------------------------------------- + testdata/bad_function_call2:1:1-22 $ + +(function(x) x)(1, 2) + +------------------------------------------------- + During evaluation + + diff --git a/testdata/bad_function_call_and_error.golden b/testdata/bad_function_call_and_error.golden index 83f8a45..404490a 100644 --- a/testdata/bad_function_call_and_error.golden +++ b/testdata/bad_function_call_and_error.golden @@ -1 +1,10 @@ RUNTIME ERROR: function expected 1 argument(s), but got 2 +------------------------------------------------- + testdata/bad_function_call_and_error:1:1-38 $ + +(function(x) x)(error "x", error "y") + +------------------------------------------------- + During evaluation + + diff --git a/testdata/bitwise_and4.golden b/testdata/bitwise_and4.golden index 57d4eaa..9bd1b50 100644 --- a/testdata/bitwise_and4.golden +++ b/testdata/bitwise_and4.golden @@ -1 +1,15 @@ RUNTIME ERROR: x +------------------------------------------------- + testdata/bitwise_and4:1:5-13 $ + +1 & error "x" + +------------------------------------------------- + testdata/bitwise_and4:1:1-13 $ + +1 & error "x" + +------------------------------------------------- + During evaluation + + diff --git a/testdata/bitwise_xor7.golden b/testdata/bitwise_xor7.golden index 57d4eaa..1970bcc 100644 --- a/testdata/bitwise_xor7.golden +++ b/testdata/bitwise_xor7.golden @@ -1 +1,15 @@ RUNTIME ERROR: x +------------------------------------------------- + testdata/bitwise_xor7:1:5-13 $ + +1 ^ error "x" + +------------------------------------------------- + testdata/bitwise_xor7:1:1-13 $ + +1 ^ error "x" + +------------------------------------------------- + During evaluation + + diff --git a/testdata/block_string.golden b/testdata/block_string.golden new file mode 100644 index 0000000..59218f9 --- /dev/null +++ b/testdata/block_string.golden @@ -0,0 +1 @@ +"x\n\ty\nz\n" diff --git a/testdata/block_string.jsonnet b/testdata/block_string.jsonnet new file mode 100644 index 0000000..2f6aaf7 --- /dev/null +++ b/testdata/block_string.jsonnet @@ -0,0 +1,5 @@ +||| + x + y + z +||| diff --git a/testdata/builtinChar3.golden b/testdata/builtinChar3.golden index 12c2801..07d9471 100644 --- a/testdata/builtinChar3.golden +++ b/testdata/builtinChar3.golden @@ -1 +1,8 @@ RUNTIME ERROR: Codepoints must be >= 0, got -1 +------------------------------------------------- + builtin function + +------------------------------------------------- + During evaluation + + diff --git a/testdata/builtinChar5.golden b/testdata/builtinChar5.golden index 130e096..26df2a7 100644 --- a/testdata/builtinChar5.golden +++ b/testdata/builtinChar5.golden @@ -1 +1,8 @@ RUNTIME ERROR: Invalid unicode codepoint, got 1.114112e+06 +------------------------------------------------- + builtin function + +------------------------------------------------- + During evaluation + + diff --git a/testdata/builtinObjectHasExBadField.golden b/testdata/builtinObjectHasExBadField.golden index f94e054..23d0a62 100644 --- a/testdata/builtinObjectHasExBadField.golden +++ b/testdata/builtinObjectHasExBadField.golden @@ -1 +1,8 @@ RUNTIME ERROR: Unexpected type number, expected string +------------------------------------------------- + builtin function + +------------------------------------------------- + During evaluation + + diff --git a/testdata/builtinObjectHasExBadObject.golden b/testdata/builtinObjectHasExBadObject.golden index 23ae9e6..04f91fb 100644 --- a/testdata/builtinObjectHasExBadObject.golden +++ b/testdata/builtinObjectHasExBadObject.golden @@ -1 +1,8 @@ RUNTIME ERROR: Unexpected type number, expected object +------------------------------------------------- + builtin function + +------------------------------------------------- + During evaluation + + diff --git a/testdata/builtin_exp3.golden b/testdata/builtin_exp3.golden index a4fc2c4..5527acd 100644 --- a/testdata/builtin_exp3.golden +++ b/testdata/builtin_exp3.golden @@ -1 +1,8 @@ RUNTIME ERROR: Overflow +------------------------------------------------- + builtin function + +------------------------------------------------- + During evaluation + + diff --git a/testdata/builtin_exp5.golden b/testdata/builtin_exp5.golden index a4fc2c4..5527acd 100644 --- a/testdata/builtin_exp5.golden +++ b/testdata/builtin_exp5.golden @@ -1 +1,8 @@ RUNTIME ERROR: Overflow +------------------------------------------------- + builtin function + +------------------------------------------------- + During evaluation + + diff --git a/testdata/builtin_log5.golden b/testdata/builtin_log5.golden index a4fc2c4..a303a67 100644 --- a/testdata/builtin_log5.golden +++ b/testdata/builtin_log5.golden @@ -1 +1,8 @@ RUNTIME ERROR: Overflow +------------------------------------------------- + builtin function + +------------------------------------------------- + During evaluation + + diff --git a/testdata/builtin_log7.golden b/testdata/builtin_log7.golden index 7ab1e7d..f16ac24 100644 --- a/testdata/builtin_log7.golden +++ b/testdata/builtin_log7.golden @@ -1 +1,8 @@ RUNTIME ERROR: Not a number +------------------------------------------------- + builtin function + +------------------------------------------------- + During evaluation + + diff --git a/testdata/builtin_log8.golden b/testdata/builtin_log8.golden index 7ab1e7d..f16ac24 100644 --- a/testdata/builtin_log8.golden +++ b/testdata/builtin_log8.golden @@ -1 +1,8 @@ RUNTIME ERROR: Not a number +------------------------------------------------- + builtin function + +------------------------------------------------- + During evaluation + + diff --git a/testdata/call_number.golden b/testdata/call_number.golden index 6777168..adc9f08 100644 --- a/testdata/call_number.golden +++ b/testdata/call_number.golden @@ -1 +1,10 @@ RUNTIME ERROR: Unexpected type number, expected function +------------------------------------------------- + testdata/call_number:1:1-5 $ + +42() + +------------------------------------------------- + During evaluation + + diff --git a/testdata/div4.golden b/testdata/div4.golden index a4fc2c4..4042503 100644 --- a/testdata/div4.golden +++ b/testdata/div4.golden @@ -1 +1,10 @@ RUNTIME ERROR: Overflow +------------------------------------------------- + testdata/div4:1:1-19 $ + +1/(1e-160)/(1e-160) + +------------------------------------------------- + During evaluation + + diff --git a/testdata/div_by_zero.golden b/testdata/div_by_zero.golden index f64d92c..48b8cbe 100644 --- a/testdata/div_by_zero.golden +++ b/testdata/div_by_zero.golden @@ -1 +1,10 @@ RUNTIME ERROR: Division by zero. +------------------------------------------------- + testdata/div_by_zero:1:1-4 $ + +1/0 + +------------------------------------------------- + During evaluation + + diff --git a/testdata/double_thunk.golden b/testdata/double_thunk.golden new file mode 100644 index 0000000..b585984 --- /dev/null +++ b/testdata/double_thunk.golden @@ -0,0 +1,20 @@ +RUNTIME ERROR: xxx +------------------------------------------------- + testdata/double_thunk:1:21-31 thunk from from <$>> + +local x = local y = error "xxx"; y; x + +------------------------------------------------- + testdata/double_thunk:1:34-35 thunk from <$> + +local x = local y = error "xxx"; y; x + +------------------------------------------------- + testdata/double_thunk:1:37-38 $ + +local x = local y = error "xxx"; y; x + +------------------------------------------------- + During evaluation + + diff --git a/testdata/double_thunk.jsonnet b/testdata/double_thunk.jsonnet new file mode 100644 index 0000000..f2a6767 --- /dev/null +++ b/testdata/double_thunk.jsonnet @@ -0,0 +1 @@ +local x = local y = error "xxx"; y; x diff --git a/testdata/error.golden b/testdata/error.golden index e699a8b..9af9b18 100644 --- a/testdata/error.golden +++ b/testdata/error.golden @@ -1 +1,10 @@ RUNTIME ERROR: 42 +------------------------------------------------- + testdata/error:1:1-10 $ + +error "42" + +------------------------------------------------- + During evaluation + + diff --git a/testdata/error_from_array.golden b/testdata/error_from_array.golden new file mode 100644 index 0000000..b9babee --- /dev/null +++ b/testdata/error_from_array.golden @@ -0,0 +1,15 @@ +RUNTIME ERROR: xxx +------------------------------------------------- + testdata/error_from_array:1:2-12 thunk from <$> + +[error "xxx"][0] + +------------------------------------------------- + testdata/error_from_array:1:1-17 $ + +[error "xxx"][0] + +------------------------------------------------- + During evaluation + + diff --git a/testdata/error_from_array.jsonnet b/testdata/error_from_array.jsonnet new file mode 100644 index 0000000..a4eaba2 --- /dev/null +++ b/testdata/error_from_array.jsonnet @@ -0,0 +1 @@ +[error "xxx"][0] diff --git a/testdata/error_from_func.golden b/testdata/error_from_func.golden new file mode 100644 index 0000000..40866d3 --- /dev/null +++ b/testdata/error_from_func.golden @@ -0,0 +1,15 @@ +RUNTIME ERROR: xxx +------------------------------------------------- + testdata/error_from_func:1:25-32 function + +local foo = function(x) error x; foo("xxx") + +------------------------------------------------- + testdata/error_from_func:1:34-44 $ + +local foo = function(x) error x; foo("xxx") + +------------------------------------------------- + During evaluation + + diff --git a/testdata/error_from_func.jsonnet b/testdata/error_from_func.jsonnet new file mode 100644 index 0000000..a653508 --- /dev/null +++ b/testdata/error_from_func.jsonnet @@ -0,0 +1 @@ +local foo = function(x) error x; foo("xxx") diff --git a/testdata/error_hexnumber.golden b/testdata/error_hexnumber.golden index 5df6103..183ba69 100644 --- a/testdata/error_hexnumber.golden +++ b/testdata/error_hexnumber.golden @@ -1 +1,5 @@ testdata/error_hexnumber:1:2-5 Did not expect: (IDENTIFIER, "x42") + +0x42 + + diff --git a/testdata/error_in_method.golden b/testdata/error_in_method.golden new file mode 100644 index 0000000..7e40fc7 --- /dev/null +++ b/testdata/error_in_method.golden @@ -0,0 +1,15 @@ +RUNTIME ERROR: xxx +------------------------------------------------- + testdata/error_in_method:1:23-30 function + +local obj = { foo(x): error x }; obj.foo("xxx") + +------------------------------------------------- + testdata/error_in_method:1:34-48 $ + +local obj = { foo(x): error x }; obj.foo("xxx") + +------------------------------------------------- + During evaluation + + diff --git a/testdata/error_in_method.jsonnet b/testdata/error_in_method.jsonnet new file mode 100644 index 0000000..5a7ebf1 --- /dev/null +++ b/testdata/error_in_method.jsonnet @@ -0,0 +1,4 @@ +local obj = { foo(x): error x }; obj.foo("xxx") + + + diff --git a/testdata/error_in_object_local.golden b/testdata/error_in_object_local.golden new file mode 100644 index 0000000..712abd3 --- /dev/null +++ b/testdata/error_in_object_local.golden @@ -0,0 +1,15 @@ +RUNTIME ERROR: xxx +------------------------------------------------- + testdata/error_in_object_local:1:20-29 function + +{ local foo(bar) = error bar, baz: foo("xxx") } + +------------------------------------------------- + testdata/error_in_object_local:1:36-46 object + +{ local foo(bar) = error bar, baz: foo("xxx") } + +------------------------------------------------- + During manifestation + + diff --git a/testdata/error_in_object_local.jsonnet b/testdata/error_in_object_local.jsonnet new file mode 100644 index 0000000..6a0c3d1 --- /dev/null +++ b/testdata/error_in_object_local.jsonnet @@ -0,0 +1 @@ +{ local foo(bar) = error bar, baz: foo("xxx") } diff --git a/testdata/extvar_error.golden b/testdata/extvar_error.golden index 7bc34d8..4b886ff 100644 --- a/testdata/extvar_error.golden +++ b/testdata/extvar_error.golden @@ -1 +1,13 @@ RUNTIME ERROR: xxx +------------------------------------------------- + :1:1-11 $ + +error 'xxx' + +------------------------------------------------- + builtin function + +------------------------------------------------- + During evaluation + + diff --git a/testdata/extvar_hermetic.golden b/testdata/extvar_hermetic.golden index 8225096..4b796a2 100644 --- a/testdata/extvar_hermetic.golden +++ b/testdata/extvar_hermetic.golden @@ -1 +1,5 @@ :1:1-2 Unknown variable: x + +x + + diff --git a/testdata/extvar_static_error.golden b/testdata/extvar_static_error.golden index 13442d8..d27c0ac 100644 --- a/testdata/extvar_static_error.golden +++ b/testdata/extvar_static_error.golden @@ -1 +1,5 @@ :1:1-2 Unexpected: (")", ")") while parsing terminal + +) + + diff --git a/testdata/extvar_unknown.golden b/testdata/extvar_unknown.golden index 91e9962..1bb8fed 100644 --- a/testdata/extvar_unknown.golden +++ b/testdata/extvar_unknown.golden @@ -1 +1,8 @@ RUNTIME ERROR: Undefined external variable: UNKNOWN +------------------------------------------------- + builtin function + +------------------------------------------------- + During evaluation + + diff --git a/testdata/fieldname_not_string.golden b/testdata/fieldname_not_string.golden index eba5cc7..6853c47 100644 --- a/testdata/fieldname_not_string.golden +++ b/testdata/fieldname_not_string.golden @@ -1 +1,10 @@ RUNTIME ERROR: Field name must be string, got number +------------------------------------------------- + testdata/fieldname_not_string:1:1-15 $ + +{ [1234]: 42 } + +------------------------------------------------- + During evaluation + + diff --git a/testdata/function.golden b/testdata/function.golden index e793b6e..173815d 100644 --- a/testdata/function.golden +++ b/testdata/function.golden @@ -1 +1,5 @@ RUNTIME ERROR: Couldn't manifest function in JSON output. +------------------------------------------------- + During manifestation + + diff --git a/testdata/import_block_literal.golden b/testdata/import_block_literal.golden index e1956fd..74ea8e1 100644 --- a/testdata/import_block_literal.golden +++ b/testdata/import_block_literal.golden @@ -1 +1,7 @@ testdata/import_block_literal:(1:8)-(3:4) Block string literals not allowed in imports + +import ||| + block_literals_for_imports_are_not_allowed_and_make_exactly_zero_sense +||| + + diff --git a/testdata/import_computed.golden b/testdata/import_computed.golden index a4e3fa5..aa6258d 100644 --- a/testdata/import_computed.golden +++ b/testdata/import_computed.golden @@ -1 +1,5 @@ testdata/import_computed:1:9-16 Computed imports are not allowed + +import "a" + "b" + + diff --git a/testdata/import_failure_directory.golden b/testdata/import_failure_directory.golden index b82d4f1..92fe73e 100644 --- a/testdata/import_failure_directory.golden +++ b/testdata/import_failure_directory.golden @@ -1 +1,10 @@ RUNTIME ERROR: read testdata: is a directory +------------------------------------------------- + testdata/import_failure_directory:3:1-10 $ + +import '.' + +------------------------------------------------- + During evaluation + + diff --git a/testdata/import_various_literals_escaped.golden b/testdata/import_various_literals_escaped.golden index 4b290ab..0ef618f 100644 --- a/testdata/import_various_literals_escaped.golden +++ b/testdata/import_various_literals_escaped.golden @@ -1 +1,5 @@ testdata/".jsonnet:2:1 Unexpected end of file. + + + + diff --git a/testdata/importstr_block_literal.golden b/testdata/importstr_block_literal.golden index b81de14..4c4f444 100644 --- a/testdata/importstr_block_literal.golden +++ b/testdata/importstr_block_literal.golden @@ -1 +1,7 @@ testdata/importstr_block_literal:(1:11)-(3:4) Block string literals not allowed in imports + +importstr ||| + block_literals_for_imports_are_not_allowed_and_make_exactly_zero_sense +||| + + diff --git a/testdata/importstr_computed.golden b/testdata/importstr_computed.golden index abcafe8..5d6d57f 100644 --- a/testdata/importstr_computed.golden +++ b/testdata/importstr_computed.golden @@ -1 +1,5 @@ testdata/importstr_computed:1:12-19 Computed imports are not allowed + +importstr "a" + "b" + + diff --git a/testdata/insuper2.golden b/testdata/insuper2.golden index f5947d8..e136bd4 100644 --- a/testdata/insuper2.golden +++ b/testdata/insuper2.golden @@ -1 +1,5 @@ testdata/insuper2:1:11-13 Expected token OPERATOR but got (in, "in") + +{ } { "x" in super } + + diff --git a/testdata/insuper4.golden b/testdata/insuper4.golden index d644ada..18e36ee 100644 --- a/testdata/insuper4.golden +++ b/testdata/insuper4.golden @@ -1 +1,5 @@ testdata/insuper4:1:2-13 Can't use super outside of an object. + +"x" in super + + diff --git a/testdata/insuper6.golden b/testdata/insuper6.golden index 8e21f48..4441974 100644 --- a/testdata/insuper6.golden +++ b/testdata/insuper6.golden @@ -1 +1,5 @@ testdata/insuper6:1:10-20 Unknown variable: undeclared + +{ assert undeclared in super } + + diff --git a/testdata/lazy_operator2.golden b/testdata/lazy_operator2.golden index 85fc07e..0b0e66d 100644 --- a/testdata/lazy_operator2.golden +++ b/testdata/lazy_operator2.golden @@ -1 +1,15 @@ RUNTIME ERROR: should happen +------------------------------------------------- + testdata/lazy_operator2:1:9-29 $ + +true && error "should happen" + +------------------------------------------------- + testdata/lazy_operator2:1:1-29 $ + +true && error "should happen" + +------------------------------------------------- + During evaluation + + diff --git a/testdata/nonexistent_import.golden b/testdata/nonexistent_import.golden index 5145a9d..92ac306 100644 --- a/testdata/nonexistent_import.golden +++ b/testdata/nonexistent_import.golden @@ -1 +1,10 @@ RUNTIME ERROR: Couldn't open import "no chance a file with this name exists": No match locally or in the Jsonnet library paths. +------------------------------------------------- + testdata/nonexistent_import:1:1-50 $ + +importstr 'no chance a file with this name exists' + +------------------------------------------------- + During evaluation + + diff --git a/testdata/nonexistent_import_crazy.golden b/testdata/nonexistent_import_crazy.golden index 7169f78..1372de1 100644 --- a/testdata/nonexistent_import_crazy.golden +++ b/testdata/nonexistent_import_crazy.golden @@ -1 +1,10 @@ RUNTIME ERROR: Couldn't open import "ąęółńśćźż \" ' \n\n\t\t": No match locally or in the Jsonnet library paths. +------------------------------------------------- + testdata/nonexistent_import_crazy:1:1-45 $ + +importstr "ąęółńśćźż \" \' \n\n\t\t" + +------------------------------------------------- + During evaluation + + diff --git a/testdata/number_leading_zero.golden b/testdata/number_leading_zero.golden index 8abcd7a..da20dde 100644 --- a/testdata/number_leading_zero.golden +++ b/testdata/number_leading_zero.golden @@ -1 +1,5 @@ testdata/number_leading_zero:1:2-4 Did not expect: (NUMBER, "42") + +042 + + diff --git a/testdata/object_comp_assert.golden b/testdata/object_comp_assert.golden index 7d94a53..4ab3acf 100644 --- a/testdata/object_comp_assert.golden +++ b/testdata/object_comp_assert.golden @@ -1 +1,5 @@ testdata/object_comp_assert:1:32-35 Object comprehension cannot have asserts. + +{ assert self.x == 5, ["x"]: 5 for i in [42] } + + diff --git a/testdata/object_comp_bad_field.golden b/testdata/object_comp_bad_field.golden index 355c625..7a16c9f 100644 --- a/testdata/object_comp_bad_field.golden +++ b/testdata/object_comp_bad_field.golden @@ -1 +1,5 @@ testdata/object_comp_bad_field:1:9-12 Object comprehensions can only have [e] fields. + +{ x: 42 for _ in [1] } + + diff --git a/testdata/object_comp_bad_field2.golden b/testdata/object_comp_bad_field2.golden index 0119446..a4205a8 100644 --- a/testdata/object_comp_bad_field2.golden +++ b/testdata/object_comp_bad_field2.golden @@ -1 +1,5 @@ testdata/object_comp_bad_field2:1:11-14 Object comprehensions can only have [e] fields. + +{ "x": 42 for _ in [1] } + + diff --git a/testdata/object_comp_duplicate.golden b/testdata/object_comp_duplicate.golden index 6b0fab0..ded66e7 100644 --- a/testdata/object_comp_duplicate.golden +++ b/testdata/object_comp_duplicate.golden @@ -1 +1,8 @@ RUNTIME ERROR: Duplicate field name: "x" +------------------------------------------------- + builtin function <$objectFlatMerge> + +------------------------------------------------- + During evaluation + + diff --git a/testdata/object_comp_err_elem.golden b/testdata/object_comp_err_elem.golden index 7bc34d8..851ce00 100644 --- a/testdata/object_comp_err_elem.golden +++ b/testdata/object_comp_err_elem.golden @@ -1 +1,10 @@ RUNTIME ERROR: xxx +------------------------------------------------- + testdata/object_comp_err_elem:1:11-21 object + +{ ["x"]: error "xxx" for x in [1] } + +------------------------------------------------- + During manifestation + + diff --git a/testdata/object_comp_err_index.golden b/testdata/object_comp_err_index.golden index 7bc34d8..2e600bc 100644 --- a/testdata/object_comp_err_index.golden +++ b/testdata/object_comp_err_index.golden @@ -1 +1,13 @@ RUNTIME ERROR: xxx +------------------------------------------------- + testdata/object_comp_err_index:1:4-14 $ + +{ [error "xxx"]: 42 for x in [1] } + +------------------------------------------------- + builtin function <$objectFlatMerge> + +------------------------------------------------- + During evaluation + + diff --git a/testdata/object_comp_illegal.golden b/testdata/object_comp_illegal.golden index 34d61d3..651b782 100644 --- a/testdata/object_comp_illegal.golden +++ b/testdata/object_comp_illegal.golden @@ -1 +1,5 @@ testdata/object_comp_illegal:1:15-18 Object comprehension can only have one field. + +{ local x = 5 for y in [1, 2, 3] } + + diff --git a/testdata/object_comp_int_index.golden b/testdata/object_comp_int_index.golden index eba5cc7..fca95a2 100644 --- a/testdata/object_comp_int_index.golden +++ b/testdata/object_comp_int_index.golden @@ -1 +1,13 @@ RUNTIME ERROR: Field name must be string, got number +------------------------------------------------- + testdata/object_comp_int_index:1:1-30 $ + +{ [x]: x for x in [1, 2, 3] } + +------------------------------------------------- + builtin function <$objectFlatMerge> + +------------------------------------------------- + During evaluation + + diff --git a/testdata/object_invariant10.golden b/testdata/object_invariant10.golden index a866347..f263854 100644 --- a/testdata/object_invariant10.golden +++ b/testdata/object_invariant10.golden @@ -1 +1,8 @@ RUNTIME ERROR: Object assertion failed. +------------------------------------------------- + + +------------------------------------------------- + During manifestation + + diff --git a/testdata/object_invariant11.golden b/testdata/object_invariant11.golden index a866347..7fcf45b 100644 --- a/testdata/object_invariant11.golden +++ b/testdata/object_invariant11.golden @@ -1 +1,13 @@ RUNTIME ERROR: Object assertion failed. +------------------------------------------------- + + +------------------------------------------------- + testdata/object_invariant11:1:1-19 $ + +{ assert false }.x + +------------------------------------------------- + During evaluation + + diff --git a/testdata/object_invariant13.golden b/testdata/object_invariant13.golden index 57d4eaa..2db479e 100644 --- a/testdata/object_invariant13.golden +++ b/testdata/object_invariant13.golden @@ -1 +1,10 @@ RUNTIME ERROR: x +------------------------------------------------- + testdata/object_invariant13:1:10-18 object + +{ assert error "x" } + +------------------------------------------------- + During manifestation + + diff --git a/testdata/object_invariant14.golden b/testdata/object_invariant14.golden index 7bc34d8..012d66a 100644 --- a/testdata/object_invariant14.golden +++ b/testdata/object_invariant14.golden @@ -1 +1,8 @@ RUNTIME ERROR: xxx +------------------------------------------------- + + +------------------------------------------------- + During manifestation + + diff --git a/testdata/object_invariant2.golden b/testdata/object_invariant2.golden index a866347..f263854 100644 --- a/testdata/object_invariant2.golden +++ b/testdata/object_invariant2.golden @@ -1 +1,8 @@ RUNTIME ERROR: Object assertion failed. +------------------------------------------------- + + +------------------------------------------------- + During manifestation + + diff --git a/testdata/object_invariant7.golden b/testdata/object_invariant7.golden index 449e312..98cc73a 100644 --- a/testdata/object_invariant7.golden +++ b/testdata/object_invariant7.golden @@ -1 +1,34 @@ RUNTIME ERROR: Field does not exist: x +------------------------------------------------- + testdata/object_invariant7:1:16-21 object + +{ x: 5, assert super.x == 5 } + +------------------------------------------------- + :969:29-30 thunk from from >> + + local ta = std.type(a); + +------------------------------------------------- + builtin function + +------------------------------------------------- + :971:33-35 thunk from > + + if !std.primitiveEquals(ta, tb) then + +------------------------------------------------- + builtin function + +------------------------------------------------- + :971:12-40 function + + if !std.primitiveEquals(ta, tb) then + +------------------------------------------------- + + +------------------------------------------------- + During manifestation + + diff --git a/testdata/object_invariant8.golden b/testdata/object_invariant8.golden index a866347..f263854 100644 --- a/testdata/object_invariant8.golden +++ b/testdata/object_invariant8.golden @@ -1 +1,8 @@ RUNTIME ERROR: Object assertion failed. +------------------------------------------------- + + +------------------------------------------------- + During manifestation + + diff --git a/testdata/object_invariant9.golden b/testdata/object_invariant9.golden index a866347..f263854 100644 --- a/testdata/object_invariant9.golden +++ b/testdata/object_invariant9.golden @@ -1 +1,8 @@ RUNTIME ERROR: Object assertion failed. +------------------------------------------------- + + +------------------------------------------------- + During manifestation + + diff --git a/testdata/object_invariant_plus.golden b/testdata/object_invariant_plus.golden index a866347..f263854 100644 --- a/testdata/object_invariant_plus.golden +++ b/testdata/object_invariant_plus.golden @@ -1 +1,8 @@ RUNTIME ERROR: Object assertion failed. +------------------------------------------------- + + +------------------------------------------------- + During manifestation + + diff --git a/testdata/object_invariant_plus2.golden b/testdata/object_invariant_plus2.golden index a866347..f263854 100644 --- a/testdata/object_invariant_plus2.golden +++ b/testdata/object_invariant_plus2.golden @@ -1 +1,8 @@ RUNTIME ERROR: Object assertion failed. +------------------------------------------------- + + +------------------------------------------------- + During manifestation + + diff --git a/testdata/object_invariant_plus6.golden b/testdata/object_invariant_plus6.golden index 2e2b708..20e53d9 100644 --- a/testdata/object_invariant_plus6.golden +++ b/testdata/object_invariant_plus6.golden @@ -1 +1,8 @@ RUNTIME ERROR: yyy +------------------------------------------------- + + +------------------------------------------------- + During manifestation + + diff --git a/testdata/object_local.golden b/testdata/object_local.golden new file mode 100644 index 0000000..46c7be6 --- /dev/null +++ b/testdata/object_local.golden @@ -0,0 +1,3 @@ +{ + "baz": 42 +} diff --git a/testdata/object_local.jsonnet b/testdata/object_local.jsonnet new file mode 100644 index 0000000..2861809 --- /dev/null +++ b/testdata/object_local.jsonnet @@ -0,0 +1,2 @@ +{ local foo(bar) = bar, baz: foo(42) } + diff --git a/testdata/object_local_self_super.golden b/testdata/object_local_self_super.golden new file mode 100644 index 0000000..62f8836 --- /dev/null +++ b/testdata/object_local_self_super.golden @@ -0,0 +1,6 @@ +{ + "bar": 42, + "baz": "xxx", + "foo": 42, + "z": 42 +} diff --git a/testdata/object_local_self_super.jsonnet b/testdata/object_local_self_super.jsonnet new file mode 100644 index 0000000..de1702b --- /dev/null +++ b/testdata/object_local_self_super.jsonnet @@ -0,0 +1 @@ +{ local x = self, y:: x, z: 42, foo: "xxx" } { local x = super.y, foo: x.z, bar: x.foo, baz: super.foo } diff --git a/testdata/or4.golden b/testdata/or4.golden index 7bc34d8..0442042 100644 --- a/testdata/or4.golden +++ b/testdata/or4.golden @@ -1 +1,15 @@ RUNTIME ERROR: xxx +------------------------------------------------- + testdata/or4:1:10-20 $ + +false || error "xxx" + +------------------------------------------------- + testdata/or4:1:1-20 $ + +false || error "xxx" + +------------------------------------------------- + During evaluation + + diff --git a/testdata/or5.golden b/testdata/or5.golden index 66a0ec2..8483353 100644 --- a/testdata/or5.golden +++ b/testdata/or5.golden @@ -1 +1,10 @@ RUNTIME ERROR: Unexpected type string, expected boolean +------------------------------------------------- + testdata/or5:1:2-14 $ + +"xxx" || true + +------------------------------------------------- + During evaluation + + diff --git a/testdata/or6.golden b/testdata/or6.golden index 66a0ec2..56141dd 100644 --- a/testdata/or6.golden +++ b/testdata/or6.golden @@ -1 +1,10 @@ RUNTIME ERROR: Unexpected type string, expected boolean +------------------------------------------------- + testdata/or6:1:1-14 $ + +false || "xxx" + +------------------------------------------------- + During evaluation + + diff --git a/testdata/percent_bad.golden b/testdata/percent_bad.golden index 9aa2829..92888a0 100644 --- a/testdata/percent_bad.golden +++ b/testdata/percent_bad.golden @@ -1 +1,13 @@ RUNTIME ERROR: Operator % cannot be used on types number and string. +------------------------------------------------- + :150:13-99 function + + error "Operator % cannot be used on types " + std.type(a) + " and " + std.type(b) + ".", + +------------------------------------------------- + + +------------------------------------------------- + During evaluation + + diff --git a/testdata/percent_bad2.golden b/testdata/percent_bad2.golden index ff20313..004cd8f 100644 --- a/testdata/percent_bad2.golden +++ b/testdata/percent_bad2.golden @@ -1 +1,28 @@ RUNTIME ERROR: Too many values to format: 1, expected 0 +------------------------------------------------- + :519:21-95 function + + error ("Too many values to format: " + std.length(arr) + ", expected " + j) + +------------------------------------------------- + :525:21-69 function + + format_codes_arr(codes, arr, i + 1, j, v + code) tailstrict + +------------------------------------------------- + :616:13-54 function + + format_codes_arr(codes, [vals], 0, 0, ""), + +------------------------------------------------- + :148:13-29 function + + std.format(a, b) + +------------------------------------------------- + + +------------------------------------------------- + During evaluation + + diff --git a/testdata/percent_bad3.golden b/testdata/percent_bad3.golden index 4d46db2..c757f79 100644 --- a/testdata/percent_bad3.golden +++ b/testdata/percent_bad3.golden @@ -1 +1,13 @@ RUNTIME ERROR: Operator % cannot be used on types function and number. +------------------------------------------------- + :150:13-99 function + + error "Operator % cannot be used on types " + std.type(a) + " and " + std.type(b) + ".", + +------------------------------------------------- + + +------------------------------------------------- + During evaluation + + diff --git a/testdata/percent_format_str4.golden b/testdata/percent_format_str4.golden index ed9364b..7c8403b 100644 --- a/testdata/percent_format_str4.golden +++ b/testdata/percent_format_str4.golden @@ -1 +1,38 @@ RUNTIME ERROR: Too many values to format: 2, expected 1 +------------------------------------------------- + :519:21-95 function + + error ("Too many values to format: " + std.length(arr) + ", expected " + j) + +------------------------------------------------- + :525:21-69 function + + format_codes_arr(codes, arr, i + 1, j, v + code) tailstrict + +------------------------------------------------- + :568:21-74 function + + format_codes_arr(codes, arr, i + 1, j3, v + s_padded) tailstrict; + +------------------------------------------------- + :525:21-69 function + + format_codes_arr(codes, arr, i + 1, j, v + code) tailstrict + +------------------------------------------------- + :612:13-52 function + + format_codes_arr(codes, vals, 0, 0, "") + +------------------------------------------------- + :148:13-29 function + + std.format(a, b) + +------------------------------------------------- + + +------------------------------------------------- + During evaluation + + diff --git a/testdata/percent_format_str5.golden b/testdata/percent_format_str5.golden index edf3953..fb699d0 100644 --- a/testdata/percent_format_str5.golden +++ b/testdata/percent_format_str5.golden @@ -1 +1,144 @@ RUNTIME ERROR: Not enough values to format, got 1 +------------------------------------------------- + :552:29-88 thunk from > + + error "Not enough values to format, got " + std.length(arr); + +------------------------------------------------- + :557:41-44 thunk from from >> + + format_code(val, code, tmp.fw, tmp2.prec, j2); + +------------------------------------------------- + :454:30-33 thunk from > + + std.toString(val) + +------------------------------------------------- + builtin function + +------------------------------------------------- + :557:29-74 thunk from > + + format_code(val, code, tmp.fw, tmp2.prec, j2); + +------------------------------------------------- + :562:38-39 thunk from from >> + + pad_left(s, tmp.fw, " "); + +------------------------------------------------- + :369:36-39 thunk from >> + + padding(w - std.length(str), s) + str; + +------------------------------------------------- + builtin function + +------------------------------------------------- + :369:21-40 thunk from > + + padding(w - std.length(str), s) + str; + +------------------------------------------------- + :365:17-18 thunk from > + + aux(w, ""); + +------------------------------------------------- + :361:20-21 function + + if w <= 0 then + +------------------------------------------------- + :361:20-26 function + + if w <= 0 then + +------------------------------------------------- + :365:13-23 function + + aux(w, ""); + +------------------------------------------------- + :369:13-44 function + + padding(w - std.length(str), s) + str; + +------------------------------------------------- + :369:13-50 function + + padding(w - std.length(str), s) + str; + +------------------------------------------------- + :562:29-53 thunk from > + + pad_left(s, tmp.fw, " "); + +------------------------------------------------- + :568:65-73 thunk from > + + format_codes_arr(codes, arr, i + 1, j3, v + s_padded) tailstrict; + +------------------------------------------------- + :568:61-73 thunk from > + + format_codes_arr(codes, arr, i + 1, j3, v + s_padded) tailstrict; + +------------------------------------------------- + :525:60-61 thunk from > + + format_codes_arr(codes, arr, i + 1, j, v + code) tailstrict + +------------------------------------------------- + :525:60-68 thunk from > + + format_codes_arr(codes, arr, i + 1, j, v + code) tailstrict + +------------------------------------------------- + :521:21-22 function + + v + +------------------------------------------------- + :525:21-69 function + + format_codes_arr(codes, arr, i + 1, j, v + code) tailstrict + +------------------------------------------------- + :568:21-74 function + + format_codes_arr(codes, arr, i + 1, j3, v + s_padded) tailstrict; + +------------------------------------------------- + :525:21-69 function + + format_codes_arr(codes, arr, i + 1, j, v + code) tailstrict + +------------------------------------------------- + :568:21-74 function + + format_codes_arr(codes, arr, i + 1, j3, v + s_padded) tailstrict; + +------------------------------------------------- + :525:21-69 function + + format_codes_arr(codes, arr, i + 1, j, v + code) tailstrict + +------------------------------------------------- + :612:13-52 function + + format_codes_arr(codes, vals, 0, 0, "") + +------------------------------------------------- + :148:13-29 function + + std.format(a, b) + +------------------------------------------------- + + +------------------------------------------------- + During evaluation + + diff --git a/testdata/percent_format_str6.golden b/testdata/percent_format_str6.golden index edf3953..102ce43 100644 --- a/testdata/percent_format_str6.golden +++ b/testdata/percent_format_str6.golden @@ -1 +1,144 @@ RUNTIME ERROR: Not enough values to format, got 1 +------------------------------------------------- + :552:29-88 thunk from > + + error "Not enough values to format, got " + std.length(arr); + +------------------------------------------------- + :557:41-44 thunk from from >> + + format_code(val, code, tmp.fw, tmp2.prec, j2); + +------------------------------------------------- + :454:30-33 thunk from > + + std.toString(val) + +------------------------------------------------- + builtin function + +------------------------------------------------- + :557:29-74 thunk from > + + format_code(val, code, tmp.fw, tmp2.prec, j2); + +------------------------------------------------- + :562:38-39 thunk from from >> + + pad_left(s, tmp.fw, " "); + +------------------------------------------------- + :369:36-39 thunk from >> + + padding(w - std.length(str), s) + str; + +------------------------------------------------- + builtin function + +------------------------------------------------- + :369:21-40 thunk from > + + padding(w - std.length(str), s) + str; + +------------------------------------------------- + :365:17-18 thunk from > + + aux(w, ""); + +------------------------------------------------- + :361:20-21 function + + if w <= 0 then + +------------------------------------------------- + :361:20-26 function + + if w <= 0 then + +------------------------------------------------- + :365:13-23 function + + aux(w, ""); + +------------------------------------------------- + :369:13-44 function + + padding(w - std.length(str), s) + str; + +------------------------------------------------- + :369:13-50 function + + padding(w - std.length(str), s) + str; + +------------------------------------------------- + :562:29-53 thunk from > + + pad_left(s, tmp.fw, " "); + +------------------------------------------------- + :568:65-73 thunk from > + + format_codes_arr(codes, arr, i + 1, j3, v + s_padded) tailstrict; + +------------------------------------------------- + :568:61-73 thunk from > + + format_codes_arr(codes, arr, i + 1, j3, v + s_padded) tailstrict; + +------------------------------------------------- + :525:60-61 thunk from > + + format_codes_arr(codes, arr, i + 1, j, v + code) tailstrict + +------------------------------------------------- + :525:60-68 thunk from > + + format_codes_arr(codes, arr, i + 1, j, v + code) tailstrict + +------------------------------------------------- + :521:21-22 function + + v + +------------------------------------------------- + :525:21-69 function + + format_codes_arr(codes, arr, i + 1, j, v + code) tailstrict + +------------------------------------------------- + :568:21-74 function + + format_codes_arr(codes, arr, i + 1, j3, v + s_padded) tailstrict; + +------------------------------------------------- + :525:21-69 function + + format_codes_arr(codes, arr, i + 1, j, v + code) tailstrict + +------------------------------------------------- + :568:21-74 function + + format_codes_arr(codes, arr, i + 1, j3, v + s_padded) tailstrict; + +------------------------------------------------- + :525:21-69 function + + format_codes_arr(codes, arr, i + 1, j, v + code) tailstrict + +------------------------------------------------- + :616:13-54 function + + format_codes_arr(codes, [vals], 0, 0, ""), + +------------------------------------------------- + :148:13-29 function + + std.format(a, b) + +------------------------------------------------- + + +------------------------------------------------- + During evaluation + + diff --git a/testdata/percent_format_str7.golden b/testdata/percent_format_str7.golden index b348175..7913ac8 100644 --- a/testdata/percent_format_str7.golden +++ b/testdata/percent_format_str7.golden @@ -1 +1,122 @@ RUNTIME ERROR: Format required number at 0, got string +------------------------------------------------- + :(457:21)-(458:57) function + + error "Format required number at " + + i + ", got " + std.type(val) + +------------------------------------------------- + :557:29-74 thunk from > + + format_code(val, code, tmp.fw, tmp2.prec, j2); + +------------------------------------------------- + :562:38-39 thunk from from >> + + pad_left(s, tmp.fw, " "); + +------------------------------------------------- + :369:36-39 thunk from >> + + padding(w - std.length(str), s) + str; + +------------------------------------------------- + builtin function + +------------------------------------------------- + :369:21-40 thunk from > + + padding(w - std.length(str), s) + str; + +------------------------------------------------- + :365:17-18 thunk from > + + aux(w, ""); + +------------------------------------------------- + :361:20-21 function + + if w <= 0 then + +------------------------------------------------- + :361:20-26 function + + if w <= 0 then + +------------------------------------------------- + :365:13-23 function + + aux(w, ""); + +------------------------------------------------- + :369:13-44 function + + padding(w - std.length(str), s) + str; + +------------------------------------------------- + :369:13-50 function + + padding(w - std.length(str), s) + str; + +------------------------------------------------- + :562:29-53 thunk from > + + pad_left(s, tmp.fw, " "); + +------------------------------------------------- + :568:65-73 thunk from > + + format_codes_arr(codes, arr, i + 1, j3, v + s_padded) tailstrict; + +------------------------------------------------- + :568:61-73 thunk from > + + format_codes_arr(codes, arr, i + 1, j3, v + s_padded) tailstrict; + +------------------------------------------------- + :525:60-61 thunk from > + + format_codes_arr(codes, arr, i + 1, j, v + code) tailstrict + +------------------------------------------------- + :525:60-68 thunk from > + + format_codes_arr(codes, arr, i + 1, j, v + code) tailstrict + +------------------------------------------------- + :521:21-22 function + + v + +------------------------------------------------- + :525:21-69 function + + format_codes_arr(codes, arr, i + 1, j, v + code) tailstrict + +------------------------------------------------- + :568:21-74 function + + format_codes_arr(codes, arr, i + 1, j3, v + s_padded) tailstrict; + +------------------------------------------------- + :525:21-69 function + + format_codes_arr(codes, arr, i + 1, j, v + code) tailstrict + +------------------------------------------------- + :612:13-52 function + + format_codes_arr(codes, vals, 0, 0, "") + +------------------------------------------------- + :148:13-29 function + + std.format(a, b) + +------------------------------------------------- + + +------------------------------------------------- + During evaluation + + diff --git a/testdata/percent_mod_int5.golden b/testdata/percent_mod_int5.golden index f64d92c..2d7e8db 100644 --- a/testdata/percent_mod_int5.golden +++ b/testdata/percent_mod_int5.golden @@ -1 +1,11 @@ RUNTIME ERROR: Division by zero. +------------------------------------------------- + builtin function + +------------------------------------------------- + + +------------------------------------------------- + During evaluation + + diff --git a/testdata/plus5.golden b/testdata/plus5.golden index 392356b..b1b298d 100644 --- a/testdata/plus5.golden +++ b/testdata/plus5.golden @@ -1 +1,10 @@ RUNTIME ERROR: Unexpected type function, expected number +------------------------------------------------- + testdata/plus5:1:1-19 $ + +42 + function() 42 + +------------------------------------------------- + During evaluation + + diff --git a/testdata/pow4.golden b/testdata/pow4.golden index 7ab1e7d..24c946e 100644 --- a/testdata/pow4.golden +++ b/testdata/pow4.golden @@ -1 +1,8 @@ RUNTIME ERROR: Not a number +------------------------------------------------- + builtin function + +------------------------------------------------- + During evaluation + + diff --git a/testdata/pow7.golden b/testdata/pow7.golden index a4fc2c4..82cc71f 100644 --- a/testdata/pow7.golden +++ b/testdata/pow7.golden @@ -1 +1,8 @@ RUNTIME ERROR: Overflow +------------------------------------------------- + builtin function + +------------------------------------------------- + During evaluation + + diff --git a/testdata/recursive_thunk.golden b/testdata/recursive_thunk.golden new file mode 100644 index 0000000..9504ad1 --- /dev/null +++ b/testdata/recursive_thunk.golden @@ -0,0 +1,50 @@ +RUNTIME ERROR: xxx +------------------------------------------------- + testdata/recursive_thunk:1:35-45 function + +local bar(th, x) = if x == 0 then error "xxx" else th; + +------------------------------------------------- + testdata/recursive_thunk:2:16-38 function + +local foo(x) = bar(foo(x - 1), x - 1); + +------------------------------------------------- + testdata/recursive_thunk:2:20-30 thunk from > + +local foo(x) = bar(foo(x - 1), x - 1); + +------------------------------------------------- + testdata/recursive_thunk:1:52-54 function + +local bar(th, x) = if x == 0 then error "xxx" else th; + +------------------------------------------------- + testdata/recursive_thunk:2:16-38 function + +local foo(x) = bar(foo(x - 1), x - 1); + +------------------------------------------------- + testdata/recursive_thunk:2:20-30 thunk from > + +local foo(x) = bar(foo(x - 1), x - 1); + +------------------------------------------------- + testdata/recursive_thunk:1:52-54 function + +local bar(th, x) = if x == 0 then error "xxx" else th; + +------------------------------------------------- + testdata/recursive_thunk:2:16-38 function + +local foo(x) = bar(foo(x - 1), x - 1); + +------------------------------------------------- + testdata/recursive_thunk:3:1-7 $ + +foo(3) + +------------------------------------------------- + During evaluation + + diff --git a/testdata/recursive_thunk.jsonnet b/testdata/recursive_thunk.jsonnet new file mode 100644 index 0000000..be80ee8 --- /dev/null +++ b/testdata/recursive_thunk.jsonnet @@ -0,0 +1,3 @@ +local bar(th, x) = if x == 0 then error "xxx" else th; +local foo(x) = bar(foo(x - 1), x - 1); +foo(3) diff --git a/testdata/static_error_eof.golden b/testdata/static_error_eof.golden new file mode 100644 index 0000000..ec91a26 --- /dev/null +++ b/testdata/static_error_eof.golden @@ -0,0 +1,5 @@ +testdata/static_error_eof:2:1 Expected , or ; but got end of file + + + + diff --git a/testdata/static_error_eof.jsonnet b/testdata/static_error_eof.jsonnet new file mode 100644 index 0000000..1167177 --- /dev/null +++ b/testdata/static_error_eof.jsonnet @@ -0,0 +1 @@ +local x = 5 diff --git a/testdata/std.codepoint3.golden b/testdata/std.codepoint3.golden index a5a70e0..2640e27 100644 --- a/testdata/std.codepoint3.golden +++ b/testdata/std.codepoint3.golden @@ -1 +1,8 @@ RUNTIME ERROR: codepoint takes a string of length 1, got length 2 +------------------------------------------------- + builtin function + +------------------------------------------------- + During evaluation + + diff --git a/testdata/std.codepoint6.golden b/testdata/std.codepoint6.golden index 8eca754..8c818a3 100644 --- a/testdata/std.codepoint6.golden +++ b/testdata/std.codepoint6.golden @@ -1 +1,8 @@ RUNTIME ERROR: codepoint takes a string of length 1, got length 0 +------------------------------------------------- + builtin function + +------------------------------------------------- + During evaluation + + diff --git a/testdata/std.codepoint7.golden b/testdata/std.codepoint7.golden index a5a70e0..2640e27 100644 --- a/testdata/std.codepoint7.golden +++ b/testdata/std.codepoint7.golden @@ -1 +1,8 @@ RUNTIME ERROR: codepoint takes a string of length 1, got length 2 +------------------------------------------------- + builtin function + +------------------------------------------------- + During evaluation + + diff --git a/testdata/std.filter2.golden b/testdata/std.filter2.golden index 57d4eaa..14fc74d 100644 --- a/testdata/std.filter2.golden +++ b/testdata/std.filter2.golden @@ -1 +1,13 @@ RUNTIME ERROR: x +------------------------------------------------- + testdata/std.filter2:1:12-20 thunk from <$> + +std.filter(error "x", []) + +------------------------------------------------- + builtin function + +------------------------------------------------- + During evaluation + + diff --git a/testdata/std.filter4.golden b/testdata/std.filter4.golden index 6777168..609d74f 100644 --- a/testdata/std.filter4.golden +++ b/testdata/std.filter4.golden @@ -1 +1,8 @@ RUNTIME ERROR: Unexpected type number, expected function +------------------------------------------------- + builtin function + +------------------------------------------------- + During evaluation + + diff --git a/testdata/std.filter5.golden b/testdata/std.filter5.golden index 97c7940..24b97ab 100644 --- a/testdata/std.filter5.golden +++ b/testdata/std.filter5.golden @@ -1 +1,8 @@ RUNTIME ERROR: Unexpected type number, expected array +------------------------------------------------- + builtin function + +------------------------------------------------- + During evaluation + + diff --git a/testdata/std.filter6.golden b/testdata/std.filter6.golden index d2fe412..271c638 100644 --- a/testdata/std.filter6.golden +++ b/testdata/std.filter6.golden @@ -1 +1,8 @@ RUNTIME ERROR: Unexpected type string, expected array +------------------------------------------------- + builtin function + +------------------------------------------------- + During evaluation + + diff --git a/testdata/std.filter_swapped_args.golden b/testdata/std.filter_swapped_args.golden index 96515b3..1be2aa0 100644 --- a/testdata/std.filter_swapped_args.golden +++ b/testdata/std.filter_swapped_args.golden @@ -1 +1,8 @@ RUNTIME ERROR: Unexpected type function, expected array +------------------------------------------------- + builtin function + +------------------------------------------------- + During evaluation + + diff --git a/testdata/std.flatmap5.golden b/testdata/std.flatmap5.golden index bc15000..d020334 100644 --- a/testdata/std.flatmap5.golden +++ b/testdata/std.flatmap5.golden @@ -1 +1,16 @@ RUNTIME ERROR: a +------------------------------------------------- + testdata/std.flatmap5:1:21-28 function + +local failWith(x) = error x; + +------------------------------------------------- + builtin function + +------------------------------------------------- + builtin function + +------------------------------------------------- + During evaluation + + diff --git a/testdata/std.makeArray_recursive_evalutation_order_matters.golden b/testdata/std.makeArray_recursive_evalutation_order_matters.golden index e3fd674..16603ae 100644 --- a/testdata/std.makeArray_recursive_evalutation_order_matters.golden +++ b/testdata/std.makeArray_recursive_evalutation_order_matters.golden @@ -1 +1,2505 @@ RUNTIME ERROR: Max stack frames exceeded. +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-57 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:51-61 function + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + testdata/std.makeArray_recursive_evalutation_order_matters:1:64-72 $ + +local arr = [0] + std.makeArray(2000, function(i) arr[i] + 1); arr[500] + +------------------------------------------------- + During evaluation + + diff --git a/testdata/std.md5_6.golden b/testdata/std.md5_6.golden index f94e054..0423e92 100644 --- a/testdata/std.md5_6.golden +++ b/testdata/std.md5_6.golden @@ -1 +1,8 @@ RUNTIME ERROR: Unexpected type number, expected string +------------------------------------------------- + builtin function + +------------------------------------------------- + During evaluation + + diff --git a/testdata/std.primitiveEquals10.golden b/testdata/std.primitiveEquals10.golden index 57d4eaa..15e15dc 100644 --- a/testdata/std.primitiveEquals10.golden +++ b/testdata/std.primitiveEquals10.golden @@ -1 +1,13 @@ RUNTIME ERROR: x +------------------------------------------------- + testdata/std.primitiveEquals10:1:21-29 thunk from <$> + +std.primitiveEquals(error "x", 42) + +------------------------------------------------- + builtin function + +------------------------------------------------- + During evaluation + + diff --git a/testdata/std.primitiveEquals13.golden b/testdata/std.primitiveEquals13.golden index 53deed7..56708da 100644 --- a/testdata/std.primitiveEquals13.golden +++ b/testdata/std.primitiveEquals13.golden @@ -1 +1,8 @@ RUNTIME ERROR: primitiveEquals operates on primitive types, got array +------------------------------------------------- + builtin function + +------------------------------------------------- + During evaluation + + diff --git a/testdata/std.primitiveEquals6.golden b/testdata/std.primitiveEquals6.golden index d618d40..1a543ee 100644 --- a/testdata/std.primitiveEquals6.golden +++ b/testdata/std.primitiveEquals6.golden @@ -1 +1,8 @@ RUNTIME ERROR: primitiveEquals operates on primitive types, got object +------------------------------------------------- + builtin function + +------------------------------------------------- + During evaluation + + diff --git a/testdata/std.primitiveEquals7.golden b/testdata/std.primitiveEquals7.golden index fe63265..cc5950a 100644 --- a/testdata/std.primitiveEquals7.golden +++ b/testdata/std.primitiveEquals7.golden @@ -1 +1,8 @@ RUNTIME ERROR: Cannot test equality of functions +------------------------------------------------- + builtin function + +------------------------------------------------- + During evaluation + + diff --git a/testdata/std.primitiveEquals9.golden b/testdata/std.primitiveEquals9.golden index 57d4eaa..f1278d0 100644 --- a/testdata/std.primitiveEquals9.golden +++ b/testdata/std.primitiveEquals9.golden @@ -1 +1,13 @@ RUNTIME ERROR: x +------------------------------------------------- + testdata/std.primitiveEquals9:1:25-33 thunk from <$> + +std.primitiveEquals(42, error "x") + +------------------------------------------------- + builtin function + +------------------------------------------------- + During evaluation + + diff --git a/testdata/std.toString5.golden b/testdata/std.toString5.golden index 57d4eaa..273457e 100644 --- a/testdata/std.toString5.golden +++ b/testdata/std.toString5.golden @@ -1 +1,13 @@ RUNTIME ERROR: x +------------------------------------------------- + testdata/std.toString5:1:14-22 thunk from <$> + +std.toString(error "x") + +------------------------------------------------- + builtin function + +------------------------------------------------- + During evaluation + + diff --git a/testdata/string_index_negative.golden b/testdata/string_index_negative.golden index 70d9609..eed3fcc 100644 --- a/testdata/string_index_negative.golden +++ b/testdata/string_index_negative.golden @@ -1 +1,10 @@ RUNTIME ERROR: Index -1 out of bounds, not within [0, 4) +------------------------------------------------- + testdata/string_index_negative:1:2-11 $ + +"abcd"[-1] + +------------------------------------------------- + During evaluation + + diff --git a/testdata/string_index_out_of_bounds.golden b/testdata/string_index_out_of_bounds.golden index d2d1c73..8f62929 100644 --- a/testdata/string_index_out_of_bounds.golden +++ b/testdata/string_index_out_of_bounds.golden @@ -1 +1,10 @@ RUNTIME ERROR: Index 4 out of bounds, not within [0, 4) +------------------------------------------------- + testdata/string_index_out_of_bounds:1:2-10 $ + +"abcd"[4] + +------------------------------------------------- + During evaluation + + diff --git a/testdata/supersugar8.golden b/testdata/supersugar8.golden index a866347..f263854 100644 --- a/testdata/supersugar8.golden +++ b/testdata/supersugar8.golden @@ -1 +1,8 @@ RUNTIME ERROR: Object assertion failed. +------------------------------------------------- + + +------------------------------------------------- + During manifestation + + diff --git a/testdata/type_error.golden b/testdata/type_error.golden index 7bc34d8..51dc5f7 100644 --- a/testdata/type_error.golden +++ b/testdata/type_error.golden @@ -1 +1,13 @@ RUNTIME ERROR: xxx +------------------------------------------------- + testdata/type_error:1:10-20 thunk from <$> + +std.type(error "xxx") + +------------------------------------------------- + builtin function + +------------------------------------------------- + During evaluation + + diff --git a/testdata/unfinished_args.golden b/testdata/unfinished_args.golden index ddc6bdb..e52ff88 100644 --- a/testdata/unfinished_args.golden +++ b/testdata/unfinished_args.golden @@ -1 +1,5 @@ testdata/unfinished_args:2:1 Expected a comma before next function argument, got end of file. + + + + diff --git a/testdata/variable_not_visible.golden b/testdata/variable_not_visible.golden index cda5870..5414921 100644 --- a/testdata/variable_not_visible.golden +++ b/testdata/variable_not_visible.golden @@ -1 +1,5 @@ testdata/variable_not_visible:1:44-50 Unknown variable: nested + +local x1 = local nested = 42; nested, x2 = nested; x2 + + diff --git a/thunks.go b/thunks.go index b20734d..a8e7835 100644 --- a/thunks.go +++ b/thunks.go @@ -43,7 +43,6 @@ func (rv *readyValue) bindToObject(sb selfBinding, origBinding bindingFrame, fie // thunk holds code and environment in which the code is supposed to be evaluated type thunk struct { - name ast.Identifier env environment body ast.Node } @@ -53,19 +52,15 @@ type thunk struct { // Maybe call thunk 'exprThunk' (or astThunk but then it looks like an AST node). // Then call cachedThunk just thunk? // Or, call this makeCachedExprThunk because that's what it really is. -func makeThunk(name ast.Identifier, env environment, body ast.Node) *cachedThunk { +func makeThunk(env environment, body ast.Node) *cachedThunk { return makeCachedThunk(&thunk{ - name: name, env: env, body: body, }) } func (t *thunk) getValue(i *interpreter, trace *TraceElement) (value, error) { - context := TraceContext{ - Name: "thunk <" + string(t.name) + ">", - } - return i.EvalInCleanEnv(trace, &context, &t.env, t.body) + return i.EvalInCleanEnv(trace, &t.env, t.body) } // callThunk represents a concrete, but not yet evaluated call to a function @@ -140,7 +135,7 @@ type codeUnboundField struct { func (f *codeUnboundField) bindToObject(sb selfBinding, origBindings bindingFrame, fieldName string) potentialValue { // TODO(sbarzowski) better object names (perhaps include a field name too?) - return makeThunk("object_field", makeEnvironment(origBindings, sb), f.body) + return makeThunk(makeEnvironment(origBindings, sb), f.body) } // Provide additional bindings for a field. It shadows bindings from the object. @@ -195,11 +190,7 @@ func (closure *closure) EvalCall(arguments callArguments, e *evaluator) (value, addBindings(closure.env.upValues, argThunks), closure.env.sb, ) - // TODO(sbarzowski) better function names - context := TraceContext{ - Name: "function ", - } - return e.evalInCleanEnv(&context, &calledEnvironment, closure.function.Body) + return e.evalInCleanEnv(&calledEnvironment, closure.function.Body) } func (closure *closure) Parameters() ast.Identifiers { diff --git a/vm.go b/vm.go index 34c5f37..f24adf5 100644 --- a/vm.go +++ b/vm.go @@ -55,7 +55,7 @@ func MakeVM() *VM { MaxStack: 500, MaxTrace: 20, ext: make(vmExtMap), - ef: ErrorFormatter{}, + ef: ErrorFormatter{pretty: true, colorful: true}, } }