]> git.localhorst.tv Git - l2e.git/commitdiff
simplified definition postponing
authorDaniel Karbach <daniel.karbach@localhorst.tv>
Thu, 31 Jan 2013 07:12:29 +0000 (08:12 +0100)
committerDaniel Karbach <daniel.karbach@localhorst.tv>
Thu, 31 Jan 2013 07:12:29 +0000 (08:12 +0100)
src/loader/Interpreter.cpp
src/loader/Interpreter.h
src/main.cpp

index 8f9e9dc6eff141aa69a1d5d13ad4662293b4b329..8b54fc177913de18a1266f885cc8e959b6eb4eef 100644 (file)
@@ -329,7 +329,7 @@ void Interpreter::ReadObject(int typeId, int id, char *object, const PropertyLis
                                                        *reinterpret_cast<void **>(iter)
                                                                        = GetObject(fd.TypeId(), *j);
                                                } else {
-                                                       Postpone(typeId, id, fd.Offset() + (iter - aggregate), *j, fd.TypeId(), false);
+                                                       Postpone(iter, *j, fd.TypeId(), false);
                                                }
                                        }
                                }
@@ -355,7 +355,7 @@ void Interpreter::ReadObject(int typeId, int id, char *object, const PropertyLis
                                }
                        }
                } else {
-                       Postpone(typeId, id, fd.Offset(), i->second->GetIdentifier(), fd.TypeId(), !fd.IsReferenced());
+                       Postpone(object, i->second->GetIdentifier(), fd.TypeId(), !fd.IsReferenced(), fd.IsAggregate());
                }
        }
        td.Load(object);
@@ -860,11 +860,17 @@ bool Interpreter::CanLink(const Value &v) const {
        return v.IsLiteral() || source.IsDefined(v.GetIdentifier());
 }
 
-void Interpreter::Postpone(int type, int id, std::ptrdiff_t offset, const std::string &identifier, int linkedType, bool inlined) {
+void Interpreter::Postpone(
+               char *dest,
+               const std::string &identifier,
+               int type,
+               bool inlined,
+               bool aggregate) {
        char *str(alloc.Alloc(identifier.size() + 1));
        std::memcpy(str, identifier.c_str(), identifier.size());
        str[identifier.size()] = '\0';
-       postponedDefinitions.push_back(PostponedDefinition(type, id, offset, str, linkedType, inlined));
+       postponedDefinitions.push_back(
+                       PostponedDefinition(dest, str, type, inlined, aggregate));
 }
 
 
index 454fccc67427786e61fd3db7b8d22bc074938786..5a8e3ab8aa424ed4db977e0c471c475cea05b8af 100644 (file)
@@ -51,14 +51,22 @@ public:
                int id;
        };
        struct PostponedDefinition {
-               PostponedDefinition(int type, int id, std::ptrdiff_t offset, const char *identifier, int linkedType, bool inlined)
-               : type(type), id(id), offset(offset), identifier(identifier), linkedType(linkedType), inlined(inlined) { }
-               int type;
-               int id;
-               std::ptrdiff_t offset;
+               PostponedDefinition(
+                               char *dest,
+                               const char *identifier,
+                               int type,
+                               bool inlined,
+                               bool aggregate)
+               : dest(dest)
+               , identifier(identifier)
+               , type(type)
+               , inlined(inlined)
+               , aggregate(aggregate) { }
+               char *dest;
                const char *identifier;
-               int linkedType;
+               int type;
                bool inlined;
+               bool aggregate;
        };
 
        const std::set<std::string> &ExportedIdentifiers() const { return source.Exports(); }
@@ -85,7 +93,12 @@ private:
        SDL_Surface *GetImage(const std::string &);
 
        bool CanLink(const Value &) const;
-       void Postpone(int type, int id, std::ptrdiff_t offset, const std::string &identifier, int linkedType, bool inlined);
+       void Postpone(
+                       char *dest,
+                       const std::string &identifier,
+                       int type,
+                       bool inlined = true,
+                       bool aggregate = false);
 
 private:
        const ParsedSource &source;
index e0b7a47a3d1779eb4d290216b54326a210d38e3b..d790928dc4fb851c7a96b956a92dbff3fdd5a47e 100644 (file)
@@ -179,7 +179,7 @@ int main(int argc, char **argv) {
 
                if (intp.PostponedDefinitions().size() > 0) {
                        for (vector<Interpreter::PostponedDefinition>::const_iterator i(intp.PostponedDefinitions().begin()), end(intp.PostponedDefinitions().end()); i != end; ++i) {
-                               std::cerr << "missing definition of " << TypeDescription::Get(i->linkedType).TypeName() << " " << i->identifier << std::endl;
+                               std::cerr << "missing definition of " << TypeDescription::Get(i->type).TypeName() << " " << i->identifier << std::endl;
                        }
                        return 3;
                }