]> git.localhorst.tv Git - l2e.git/blobdiff - src/loader/Interpreter.cpp
moved map data to maps.l2s
[l2e.git] / src / loader / Interpreter.cpp
index c2ce0d4145abf20ee1b90c291ad7965d2e5446aa..0fd2d883fba0a8129b3a896dd56d37f35e4af96f 100644 (file)
@@ -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<string, ParsedDefinition>::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());
 }