From 501697e6490c3bcdacdcbe10fb3afee8856fa8e7 Mon Sep 17 00:00:00 2001 From: Marc Worrell Date: Fri, 10 Sep 2010 14:18:48 +0200 Subject: [PATCH] Fix for erlydtl crash with recursive block definitions. Added extra test. --- src/erlydtl/erlydtl_compiler.erl | 13 ++++++++++--- src/tests/erlydtl/docroot/block_recurse_error | 7 +++++++ src/tests/erlydtl_functional_tests.erl | 4 ++++ 3 files changed, 21 insertions(+), 3 deletions(-) create mode 100644 src/tests/erlydtl/docroot/block_recurse_error diff --git a/src/erlydtl/erlydtl_compiler.erl b/src/erlydtl/erlydtl_compiler.erl index b344eb6431..9d10fb8121 100755 --- a/src/erlydtl/erlydtl_compiler.erl +++ b/src/erlydtl/erlydtl_compiler.erl @@ -364,9 +364,16 @@ body_ast(DjangoParseTree, Context, TreeWalker) -> error -> {CurrentFile, Contents} end, - body_ast(Block, - Context1#dtl_context{block_trail=[{Name,BlockFile}|Context1#dtl_context.block_trail]}, - TreeWalkerAcc); + % Check if we have a recursive definition + case lists:member({Name,BlockFile}, Context#dtl_context.block_trail) of + true -> + ?ERROR("body_ast: recursive block ~p (~p)", [Name, BlockFile]), + throw({error, "Recursive block definition of '" ++ Name ++ "' (" ++ BlockFile ++ ")"}); + false -> + body_ast(Block, + Context1#dtl_context{block_trail=[{Name,BlockFile}|Context1#dtl_context.block_trail]}, + TreeWalkerAcc) + end; ('inherit', TreeWalkerAcc) -> inherit_ast(Context, TreeWalkerAcc); ({'comment', _Contents}, TreeWalkerAcc) -> diff --git a/src/tests/erlydtl/docroot/block_recurse_error b/src/tests/erlydtl/docroot/block_recurse_error new file mode 100644 index 0000000000..bed46daf44 --- /dev/null +++ b/src/tests/erlydtl/docroot/block_recurse_error @@ -0,0 +1,7 @@ +{% extends "base" %} + +{% block content %} + foo + {% block content %}oof{% endblock %} + bar +{% endblock %} diff --git a/src/tests/erlydtl_functional_tests.erl b/src/tests/erlydtl_functional_tests.erl index f1efc39665..7d24414148 100644 --- a/src/tests/erlydtl_functional_tests.erl +++ b/src/tests/erlydtl_functional_tests.erl @@ -51,6 +51,7 @@ test_list() -> "var", "cycle", "custom_tag", % "custom_tag_error", + "block_recurse_error", "custom_call", "with_multiple" ]. @@ -86,6 +87,9 @@ setup_compile("var_preset") -> setup_compile("custom_tag_error") -> CompileVars = [], {error, CompileVars}; +setup_compile("block_recurse_error") -> + CompileVars = [], + {error, CompileVars}; setup_compile(_) -> {ok, []}.