X-Git-Url: http://git.localhorst.tv/?a=blobdiff_plain;f=src%2Floader%2FInterpreter.cpp;fp=src%2Floader%2FInterpreter.cpp;h=0fd2d883fba0a8129b3a896dd56d37f35e4af96f;hb=7c43158af1abf38fa896a442cb3c6d8a5bc630e7;hp=c2ce0d4145abf20ee1b90c291ad7965d2e5446aa;hpb=77915e0186f4fc0788054eb34651c726b80d981c;p=l2e.git diff --git a/src/loader/Interpreter.cpp b/src/loader/Interpreter.cpp index c2ce0d4..0fd2d88 100644 --- a/src/loader/Interpreter.cpp +++ b/src/loader/Interpreter.cpp @@ -62,8 +62,16 @@ Interpreter::~Interpreter() { } -const Interpreter::ParsedDefinition &Interpreter::GetDefinition(const string &identifier) const { - return parsedDefinitions.at(identifier); +const Interpreter::ParsedDefinition &Interpreter::GetDefinition(const string &identifier) { + std::map::const_iterator i(parsedDefinitions.find(identifier)); + if (i != parsedDefinitions.end()) { + return i->second; + } else if (source.IsDefined(identifier)) { + ReadDefinition(source.GetDefinition(identifier)); + return parsedDefinitions.at(identifier); + } else { + throw Error("access to undefined object " + identifier); + } } @@ -114,13 +122,13 @@ void Interpreter::ReadLiteral(const Definition &dfn) { || dfn.GetLiteral()->GetType() == Literal::STRING) ? dfn.GetLiteral()->GetString().size() : td.Size()); char *object(alloc.Alloc(size)); + values[typeId].push_back(object); + parsedDefinitions.insert(make_pair(dfn.Identifier(), ParsedDefinition(&dfn, typeId, id))); if (dfn.GetLiteral()->GetType() == Literal::OBJECT) { ReadObject(typeId, id, object, *dfn.GetLiteral()->GetProperties()); } else { ReadLiteral(typeId, id, object, *dfn.GetLiteral()); } - values[typeId].push_back(object); - parsedDefinitions.insert(make_pair(dfn.Identifier(), ParsedDefinition(&dfn, typeId, id))); } void Interpreter::ReadLiteral(int typeId, int id, char *object, const Literal &literal) { @@ -221,8 +229,9 @@ void *Interpreter::GetObject(int typeId, const Value &v) { case Literal::SCRIPT: { typeId = TypeDescription::GetTypeId("Script"); + char *script(ReadScript(v.GetLiteral().GetScript())); id = values[typeId].size(); - values[typeId].push_back(ReadScript(v.GetLiteral().GetScript())); + values[typeId].push_back(script); } break; case Literal::STRING: @@ -271,8 +280,8 @@ void Interpreter::ReadObject(const Definition &dfn) { char *object(alloc.Alloc(td.Size())); td.Construct(object); values[typeId].push_back(object); - ReadObject(typeId, id, object, *dfn.GetProperties()); parsedDefinitions.insert(make_pair(dfn.Identifier(), ParsedDefinition(&dfn, typeId, id))); + ReadObject(typeId, id, object, *dfn.GetProperties()); }