aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/LuaSL/src/LuaSL_compile.c
diff options
context:
space:
mode:
authorDavid Walter Seikel2012-01-17 19:52:21 +1000
committerDavid Walter Seikel2012-01-17 19:52:21 +1000
commit36f91bf237a2d48e27171c6661eff9cc255214d0 (patch)
tree9991a29a402c321ab1d83f00cb3a81e3cf8ba5a6 /LuaSL/src/LuaSL_compile.c
parentChange to the stringshared hash, it's way faster. (diff)
downloadSledjHamr-36f91bf237a2d48e27171c6661eff9cc255214d0.zip
SledjHamr-36f91bf237a2d48e27171c6661eff9cc255214d0.tar.gz
SledjHamr-36f91bf237a2d48e27171c6661eff9cc255214d0.tar.bz2
SledjHamr-36f91bf237a2d48e27171c6661eff9cc255214d0.tar.xz
Add function parameters to the search list.
Diffstat (limited to '')
-rw-r--r--LuaSL/src/LuaSL_compile.c40
1 files changed, 31 insertions, 9 deletions
diff --git a/LuaSL/src/LuaSL_compile.c b/LuaSL/src/LuaSL_compile.c
index c28a6fc..4e089c7 100644
--- a/LuaSL/src/LuaSL_compile.c
+++ b/LuaSL/src/LuaSL_compile.c
@@ -219,10 +219,13 @@ static LSL_Leaf *findVariable(LuaSL_compiler *compiler, const char *name)
219 219
220 while ((block) && (NULL == var)) 220 while ((block) && (NULL == var))
221 { 221 {
222 if (block->variables) 222 if (block->function)
223 var = eina_hash_find(block->function->variables, name);
224 if ((NULL == var) && block->variables)
223 var = eina_hash_find(block->variables, name); 225 var = eina_hash_find(block->variables, name);
224 block = block->outerBlock; 226 block = block->outerBlock;
225 } 227 }
228
226 if (NULL == var) 229 if (NULL == var)
227 var = eina_hash_find(compiler->script.variables, name); 230 var = eina_hash_find(compiler->script.variables, name);
228 } 231 }
@@ -351,7 +354,7 @@ LSL_Leaf *addOperation(LuaSL_compiler *compiler, LSL_Leaf *left, LSL_Leaf *lval,
351 return lval; 354 return lval;
352} 355}
353 356
354LSL_Leaf *addParameter(LSL_Leaf *type, LSL_Leaf *identifier) 357LSL_Leaf *addParameter(LuaSL_compiler *compiler, LSL_Leaf *type, LSL_Leaf *identifier)
355{ 358{
356 LSL_Identifier *result = calloc(1, sizeof(LSL_Identifier)); 359 LSL_Identifier *result = calloc(1, sizeof(LSL_Identifier));
357 360
@@ -370,7 +373,7 @@ LSL_Leaf *addParameter(LSL_Leaf *type, LSL_Leaf *identifier)
370 return identifier; 373 return identifier;
371} 374}
372 375
373LSL_Leaf *collectParameters(LSL_Leaf *list, LSL_Leaf *comma, LSL_Leaf *newParam) 376LSL_Leaf *collectParameters(LuaSL_compiler *compiler, LSL_Leaf *list, LSL_Leaf *comma, LSL_Leaf *newParam)
374{ 377{
375 LSL_Leaf *newList = newLeaf(LSL_PARAMETER_LIST, NULL, NULL); 378 LSL_Leaf *newList = newLeaf(LSL_PARAMETER_LIST, NULL, NULL);
376 379
@@ -379,15 +382,13 @@ LSL_Leaf *collectParameters(LSL_Leaf *list, LSL_Leaf *comma, LSL_Leaf *newParam)
379 newList->left = list; 382 newList->left = list;
380 newList->value.listValue = newParam; 383 newList->value.listValue = newParam;
381 if ((list) && (list->value.listValue)) 384 if ((list) && (list->value.listValue))
382 {
383 list->value.listValue->right = comma; 385 list->value.listValue->right = comma;
384 }
385 } 386 }
386 387
387 return newList; 388 return newList;
388} 389}
389 390
390LSL_Leaf *addFunction(LuaSL_compiler *compiler, LSL_Leaf *type, LSL_Leaf *identifier, LSL_Leaf *open, LSL_Leaf *params, LSL_Leaf *close, LSL_Leaf *block) 391LSL_Leaf *addFunction(LuaSL_compiler *compiler, LSL_Leaf *type, LSL_Leaf *identifier, LSL_Leaf *open, LSL_Leaf *params, LSL_Leaf *close)
391{ 392{
392 LSL_Function *func = calloc(1, sizeof(LSL_Function)); 393 LSL_Function *func = calloc(1, sizeof(LSL_Function));
393 394
@@ -398,19 +399,40 @@ LSL_Leaf *addFunction(LuaSL_compiler *compiler, LSL_Leaf *type, LSL_Leaf *identi
398 func->name = identifier->value.stringValue; 399 func->name = identifier->value.stringValue;
399 identifier->token = tokens[LSL_FUNCTION - lowestToken]; 400 identifier->token = tokens[LSL_FUNCTION - lowestToken];
400 identifier->value.functionValue = func; 401 identifier->value.functionValue = func;
401 identifier->value.functionValue->block = block;
402 func->type = type; 402 func->type = type;
403 if (type) 403 if (type)
404 identifier->basicType = type->basicType; 404 identifier->basicType = type->basicType;
405 else 405 else
406 identifier->basicType = OT_nothing; 406 identifier->basicType = OT_nothing;
407 func->params = addParenthesis(open, params, LSL_PARAMETER_LIST, close);
408 eina_hash_add(compiler->script.functions, func->name, identifier); 407 eina_hash_add(compiler->script.functions, func->name, identifier);
408 func->variables = eina_hash_stringshared_new(burnLeaf);
409 func->params = addParenthesis(open, params, LSL_PARAMETER_LIST, close);
410 while (params)
411 {
412 if (params->value.listValue)
413 {
414 LSL_Identifier *identifier = params->value.listValue->value.identifierValue;
415
416 if (identifier)
417 eina_hash_add(func->variables, identifier->name, identifier);
418 }
419 params = params->left;
420 }
421 if (compiler->currentBlock)
422 compiler->currentBlock->function = func;
409 } 423 }
410 } 424 }
411 return identifier; 425 return identifier;
412} 426}
413 427
428LSL_Leaf *addFunctionBody(LuaSL_compiler *compiler, LSL_Leaf *function, LSL_Leaf *block)
429{
430 if (function)
431 function->value.functionValue->block = block;
432
433 return function;
434}
435
414LSL_Leaf *addParenthesis(LSL_Leaf *lval, LSL_Leaf *expr, LSL_Type type, LSL_Leaf *rval) 436LSL_Leaf *addParenthesis(LSL_Leaf *lval, LSL_Leaf *expr, LSL_Type type, LSL_Leaf *rval)
415{ 437{
416 LSL_Parenthesis *parens = malloc(sizeof(LSL_Parenthesis)); 438 LSL_Parenthesis *parens = malloc(sizeof(LSL_Parenthesis));
@@ -514,7 +536,7 @@ LSL_Leaf *addVariable(LuaSL_compiler *compiler, LSL_Leaf *type, LSL_Leaf *identi
514 536
515void beginBlock(LuaSL_compiler *compiler, LSL_Leaf *block) 537void beginBlock(LuaSL_compiler *compiler, LSL_Leaf *block)
516{ 538{
517 LSL_Block *blok = malloc(sizeof(LSL_Block)); 539 LSL_Block *blok = calloc(1, sizeof(LSL_Block));
518 540
519 if (blok) 541 if (blok)
520 { 542 {