diff options
Diffstat (limited to 'LuaSL/src/LuaSL_compile.c')
-rw-r--r-- | LuaSL/src/LuaSL_compile.c | 25 |
1 files changed, 16 insertions, 9 deletions
diff --git a/LuaSL/src/LuaSL_compile.c b/LuaSL/src/LuaSL_compile.c index 48f2910..e4a526a 100644 --- a/LuaSL/src/LuaSL_compile.c +++ b/LuaSL/src/LuaSL_compile.c | |||
@@ -446,6 +446,13 @@ LSL_Leaf *addOperation(LuaSL_compiler *compiler, LSL_Leaf *left, LSL_Leaf *lval, | |||
446 | return lval; | 446 | return lval; |
447 | } | 447 | } |
448 | 448 | ||
449 | LSL_Leaf *addBlock(LuaSL_compiler *compiler, LSL_Leaf *left, LSL_Leaf *lval, LSL_Leaf *right) | ||
450 | { | ||
451 | // Damn, look ahead. The } symbol is getting read (and thus endBlock called) before the last statement in the block is reduced (which actually calls the add*() functions). | ||
452 | compiler->currentBlock = compiler->currentBlock->outerBlock; | ||
453 | return lval; | ||
454 | } | ||
455 | |||
449 | LSL_Leaf *addCrement(LuaSL_compiler *compiler, LSL_Leaf *variable, LSL_Leaf *crement) | 456 | LSL_Leaf *addCrement(LuaSL_compiler *compiler, LSL_Leaf *variable, LSL_Leaf *crement) |
450 | { | 457 | { |
451 | if ((variable) && (crement)) | 458 | if ((variable) && (crement)) |
@@ -541,8 +548,7 @@ LSL_Leaf *addFunction(LuaSL_compiler *compiler, LSL_Leaf *type, LSL_Leaf *identi | |||
541 | func->params = addParenthesis(open, params, LSL_PARAMETER_LIST, close); | 548 | func->params = addParenthesis(open, params, LSL_PARAMETER_LIST, close); |
542 | #endif | 549 | #endif |
543 | } | 550 | } |
544 | if (compiler->currentBlock) | 551 | compiler->currentFunction = func; |
545 | compiler->currentBlock->function = func; | ||
546 | } | 552 | } |
547 | } | 553 | } |
548 | 554 | ||
@@ -725,12 +731,13 @@ LSL_Leaf *addStatement(LuaSL_compiler *compiler, LSL_Leaf *lval, LSL_Type type, | |||
725 | 731 | ||
726 | LSL_Leaf *collectStatements(LuaSL_compiler *compiler, LSL_Leaf *list, LSL_Leaf *statement) | 732 | LSL_Leaf *collectStatements(LuaSL_compiler *compiler, LSL_Leaf *list, LSL_Leaf *statement) |
727 | { | 733 | { |
734 | boolean wasNull = FALSE; | ||
728 | if (NULL == list) | 735 | if (NULL == list) |
729 | { | 736 | { |
730 | list = newLeaf(LSL_BLOCK_OPEN, NULL, NULL); | 737 | list = newLeaf(LSL_BLOCK_OPEN, NULL, NULL); |
731 | if (list) | 738 | if (list) |
732 | { | 739 | { |
733 | list->value.blockValue = compiler->currentBlock; // Maybe NULL. | 740 | wasNull = TRUE; |
734 | } | 741 | } |
735 | } | 742 | } |
736 | 743 | ||
@@ -738,6 +745,8 @@ LSL_Leaf *collectStatements(LuaSL_compiler *compiler, LSL_Leaf *list, LSL_Leaf * | |||
738 | { | 745 | { |
739 | if (statement) | 746 | if (statement) |
740 | { | 747 | { |
748 | if (!wasNull) | ||
749 | list->value.blockValue = compiler->currentBlock; // Maybe NULL. | ||
741 | if (list->value.blockValue) | 750 | if (list->value.blockValue) |
742 | { | 751 | { |
743 | eina_clist_add_tail(&(list->value.blockValue->statements), &(statement->value.statementValue->statement)); | 752 | eina_clist_add_tail(&(list->value.blockValue->statements), &(statement->value.statementValue->statement)); |
@@ -792,7 +801,7 @@ LSL_Leaf *addVariable(LuaSL_compiler *compiler, LSL_Leaf *type, LSL_Leaf *identi | |||
792 | return identifier; | 801 | return identifier; |
793 | } | 802 | } |
794 | 803 | ||
795 | void beginBlock(LuaSL_compiler *compiler, LSL_Leaf *block) | 804 | LSL_Leaf *beginBlock(LuaSL_compiler *compiler, LSL_Leaf *block) |
796 | { | 805 | { |
797 | LSL_Block *blok = calloc(1, sizeof(LSL_Block)); | 806 | LSL_Block *blok = calloc(1, sizeof(LSL_Block)); |
798 | 807 | ||
@@ -803,12 +812,10 @@ void beginBlock(LuaSL_compiler *compiler, LSL_Leaf *block) | |||
803 | block->value.blockValue = blok; | 812 | block->value.blockValue = blok; |
804 | blok->outerBlock = compiler->currentBlock; | 813 | blok->outerBlock = compiler->currentBlock; |
805 | compiler->currentBlock = blok; | 814 | compiler->currentBlock = blok; |
815 | blok->function = compiler->currentFunction; | ||
816 | compiler->currentFunction = NULL; | ||
806 | } | 817 | } |
807 | } | 818 | return block; |
808 | |||
809 | void endBlock(LuaSL_compiler *compiler, LSL_Leaf *block) | ||
810 | { | ||
811 | compiler->currentBlock = compiler->currentBlock->outerBlock; | ||
812 | } | 819 | } |
813 | 820 | ||
814 | static void secondPass(LuaSL_compiler *compiler, LSL_Leaf *leaf) | 821 | static void secondPass(LuaSL_compiler *compiler, LSL_Leaf *leaf) |