Permalink
Browse files

Added anomymous functions as in Konrad Kiss's resource.

  • Loading branch information...
crabmusket committed Dec 29, 2014
1 parent e9308e4 commit 1204b81a78ec6658e38dc58456a714264fa38da3
@@ -456,6 +456,19 @@ expr
{ $$ = (ExprNode*)VarNode::alloc( $1.lineNumber, $1.value, NULL); }
| VAR '[' aidx_expr ']'
{ $$ = (ExprNode*)VarNode::alloc( $1.lineNumber, $1.value, $3 ); }
| rwDEFINE '(' var_list_decl ')' '{' statement_list '}'
{
String fnname = String("__anonymous_function_" + String::ToString(gAnonFunctionID++));

This comment has been minimized.

Show comment
Hide comment
@jamesu

jamesu Dec 31, 2014

Might be better to use dSprintf in a buffer, otherwise every time you declare an anonymous function you will allocate memory. This sort of goes against the whole idea of reducing memory allocations and fragmentations by using the console alloc stuff.

@jamesu

jamesu Dec 31, 2014

Might be better to use dSprintf in a buffer, otherwise every time you declare an anonymous function you will allocate memory. This sort of goes against the whole idea of reducing memory allocations and fragmentations by using the console alloc stuff.

StringTableEntry afnName = StringTable->insert(fnname.c_str());
StmtNode *fndef = FunctionDeclStmtNode::alloc($1.lineNumber, afnName, NULL, $3, $6);
if(!gAnonFunctionList)
gAnonFunctionList = fndef;
else
gAnonFunctionList->append(fndef);
$$ = StrConstNode::alloc( $1.lineNumber, (UTF8*)fnname.utf8(), false );
}
;
slot_acc
@@ -575,6 +575,8 @@ struct FunctionDeclStmtNode : StmtNode
};
extern StmtNode *gStatementList;
extern ExprEvalState gEvalState;;
extern StmtNode *gAnonFunctionList;
extern U32 gAnonFunctionID;
extern ExprEvalState gEvalState;
#endif
@@ -468,6 +468,7 @@ bool CodeBlock::compile(const char *codeFileName, StringTableEntry fileName, con
STEtoCode = compileSTEtoCode;
gStatementList = NULL;
gAnonFunctionList = NULL;
// Set up the parser.
smCurrentParser = getParserForFile(fileName);
@@ -477,6 +478,14 @@ bool CodeBlock::compile(const char *codeFileName, StringTableEntry fileName, con
smCurrentParser->setScanBuffer(script, fileName);
smCurrentParser->restart(NULL);
smCurrentParser->parse();
if (gStatementList)
{
if (gAnonFunctionList)
{
gStatementList->append(gAnonFunctionList);
}
}
if(gSyntaxError)
{
@@ -599,6 +608,7 @@ const char *CodeBlock::compileExec(StringTableEntry fileName, const char *inStri
addToCodeList();
gStatementList = NULL;
gAnonFunctionList = NULL;
// Set up the parser.
smCurrentParser = getParserForFile(fileName);
@@ -608,6 +618,13 @@ const char *CodeBlock::compileExec(StringTableEntry fileName, const char *inStri
smCurrentParser->setScanBuffer(string, fileName);
smCurrentParser->restart(NULL);
smCurrentParser->parse();
if (gStatementList)
{
if (gAnonFunctionList)
{
gStatementList->append(gAnonFunctionList);
}
}
if(!gStatementList)
{
@@ -47,6 +47,8 @@ extern ConsoleValueStack CSTK;
ConsoleDocFragment* ConsoleDocFragment::smFirst;
ExprEvalState gEvalState;
StmtNode *gStatementList;
StmtNode *gAnonFunctionList;
U32 gAnonFunctionID = 0;
ConsoleConstructor *ConsoleConstructor::first = NULL;
bool gWarnUndefinedScriptVariables;

0 comments on commit 1204b81

Please sign in to comment.