Commit 1e38b513 authored by twanvl's avatar twanvl

Type name of ScriptObjects is now reported as the actual object type (card/set/value/etc.);

Back trace is slightly smarter
Removed move_cursor_with_sort
parent 083ca04a
...@@ -229,6 +229,12 @@ help: ...@@ -229,6 +229,12 @@ help:
drag to move line: Alt + drag to move curve; double click to add a point on this line drag to move line: Alt + drag to move curve; double click to add a point on this line
drag to move point: Click and drag to move control point; double click to remove the point drag to move point: Click and drag to move control point; double click to remove the point
rotation: Rotational symmetry (wheel)
reflection: Reflectional symmetry (mirror)
add symmetry: Add symmetries to the symbol
remove symmetry: Remove this symmetry
copies: Number of reflections (including the original)
# Card select # Card select
filename format: (Use {card.name} for the name of the card ; The filetype is determined based on the extension) filename format: (Use {card.name} for the name of the card ; The filetype is determined based on the extension)
...@@ -270,6 +276,8 @@ tool: ...@@ -270,6 +276,8 @@ tool:
rotation: Rotation rotation: Rotation
reflection: Reflection reflection: Reflection
add symmetry: Add
remove symmetry: Remove
line segment: Line line segment: Line
curve segment: Curve curve segment: Curve
...@@ -341,6 +349,8 @@ tooltip: ...@@ -341,6 +349,8 @@ tooltip:
rotation: Rotational symmetry (wheel) rotation: Rotational symmetry (wheel)
reflection: Reflectional symmetry (mirror) reflection: Reflectional symmetry (mirror)
add symmetry: Add symmetry to selected parts
remove symmetry: Remove this symmetry
line segment: To straigt line line segment: To straigt line
curve segment: To curve curve segment: To curve
...@@ -540,6 +550,14 @@ action: ...@@ -540,6 +550,14 @@ action:
delete point: Delete point delete point: Delete point
delete points: Delete points delete points: Delete points
# Symmetry
add symmetry: Add symmetry
remove symmetry: Remove symmetry
move symmetry center: Move symmetry center
move symmetry handle: Change symmetry orientation
change symmetry type: Change symmetry type
change symmetry copies: Number of reflections
############################################################## Error messages ############################################################## Error messages
error: error:
...@@ -601,6 +619,7 @@ error: ...@@ -601,6 +619,7 @@ error:
type: type:
function: function function: function
collection: collection collection: collection
collection of: collection of %ss
object: object object: object
real: real number real: real number
integer: integer number integer: integer number
...@@ -610,6 +629,15 @@ type: ...@@ -610,6 +629,15 @@ type:
image: image image: image
nil: nothing nil: nothing
# Object types
game: game
set: set
stylesheet: stylesheet
card: card
field: field
style: style
value: value
# Symbol editor shapes # Symbol editor shapes
shape: shape shape: shape
shapes: shapes shapes: shapes
......
...@@ -83,6 +83,10 @@ class Card : public IntrusivePtrVirtualBase { ...@@ -83,6 +83,10 @@ class Card : public IntrusivePtrVirtualBase {
DECLARE_REFLECTION(); DECLARE_REFLECTION();
}; };
inline String type_name(const Card&) {
return _TYPE_("card");
}
void mark_dependency_member(const Card& value, const String& name, const Dependency& dep); void mark_dependency_member(const Card& value, const String& name, const Dependency& dep);
// ----------------------------------------------------------------------------- : EOF // ----------------------------------------------------------------------------- : EOF
......
...@@ -79,6 +79,10 @@ inline void update_index(FieldP& f, size_t index) { ...@@ -79,6 +79,10 @@ inline void update_index(FieldP& f, size_t index) {
f->index = index; f->index = index;
} }
inline String type_name(const Field&) {
return _TYPE_("field");
}
// ----------------------------------------------------------------------------- : Style // ----------------------------------------------------------------------------- : Style
/// Style information needed to display a Value in a Field. /// Style information needed to display a Value in a Field.
...@@ -148,6 +152,10 @@ inline const FieldP& get_key (const StyleP& s) { return s->fieldP; } ...@@ -148,6 +152,10 @@ inline const FieldP& get_key (const StyleP& s) { return s->fieldP; }
inline const String& get_key_name(const StyleP& s) { return s->fieldP->name; } inline const String& get_key_name(const StyleP& s) { return s->fieldP->name; }
template <> StyleP read_new<Style>(Reader&); template <> StyleP read_new<Style>(Reader&);
inline String type_name(const Style&) {
return _TYPE_("style");
}
void mark_dependency_member(const Style& style, const String& name, const Dependency& dep); void mark_dependency_member(const Style& style, const String& name, const Dependency& dep);
// ----------------------------------------------------------------------------- : StyleListener // ----------------------------------------------------------------------------- : StyleListener
...@@ -201,6 +209,10 @@ inline const FieldP& get_key (const ValueP& v) { return v->fieldP; } ...@@ -201,6 +209,10 @@ inline const FieldP& get_key (const ValueP& v) { return v->fieldP; }
inline const String& get_key_name(const ValueP& v) { return v->fieldP->name; } inline const String& get_key_name(const ValueP& v) { return v->fieldP->name; }
template <> ValueP read_new<Value>(Reader&); template <> ValueP read_new<Value>(Reader&);
inline String type_name(const Value&) {
return _TYPE_("value");
}
// ----------------------------------------------------------------------------- : Utilities // ----------------------------------------------------------------------------- : Utilities
#define DECLARE_FIELD_TYPE(Type) \ #define DECLARE_FIELD_TYPE(Type) \
......
...@@ -13,7 +13,7 @@ ...@@ -13,7 +13,7 @@
// ----------------------------------------------------------------------------- : TextField // ----------------------------------------------------------------------------- : TextField
TextField::TextField() TextField::TextField()
: multi_line(false), move_cursor_with_sort(false) : multi_line(false)
, default_name(_("Default")) , default_name(_("Default"))
{} {}
...@@ -35,7 +35,6 @@ IMPLEMENT_REFLECTION(TextField) { ...@@ -35,7 +35,6 @@ IMPLEMENT_REFLECTION(TextField) {
REFLECT(multi_line); REFLECT(multi_line);
REFLECT(script); REFLECT(script);
REFLECT_N("default", default_script); REFLECT_N("default", default_script);
REFLECT(move_cursor_with_sort);
REFLECT(default_name); REFLECT(default_name);
} }
......
...@@ -36,7 +36,6 @@ class TextField : public Field { ...@@ -36,7 +36,6 @@ class TextField : public Field {
OptionalScript script; ///< Script to apply to all values OptionalScript script; ///< Script to apply to all values
OptionalScript default_script; ///< Script that generates the default value OptionalScript default_script; ///< Script that generates the default value
bool multi_line; ///< Are newlines allowed in the text? bool multi_line; ///< Are newlines allowed in the text?
bool move_cursor_with_sort; ///< When the text is reordered by a script should the cursor position be updated?
String default_name; ///< Name of "default" value String default_name; ///< Name of "default" value
virtual void initDependencies(Context&, const Dependency&) const; virtual void initDependencies(Context&, const Dependency&) const;
......
...@@ -72,5 +72,9 @@ class Game : public Packaged { ...@@ -72,5 +72,9 @@ class Game : public Packaged {
DECLARE_REFLECTION(); DECLARE_REFLECTION();
}; };
inline String type_name(const Game&) {
return _TYPE_("game");
}
// ----------------------------------------------------------------------------- : EOF // ----------------------------------------------------------------------------- : EOF
#endif #endif
...@@ -125,6 +125,9 @@ class Set : public Packaged { ...@@ -125,6 +125,9 @@ class Set : public Packaged {
map<ScriptValueP,OrderCacheP> order_cache; map<ScriptValueP,OrderCacheP> order_cache;
}; };
inline String type_name(const Set&) {
return _TYPE_("set");
}
inline int item_count(const Set& set) { inline int item_count(const Set& set) {
return (int)set.cards.size(); return (int)set.cards.size();
} }
......
...@@ -70,5 +70,9 @@ class StyleSheet : public Packaged { ...@@ -70,5 +70,9 @@ class StyleSheet : public Packaged {
DECLARE_REFLECTION(); DECLARE_REFLECTION();
}; };
inline String type_name(const StyleSheet&) {
return _TYPE_("stylesheet");
}
// ----------------------------------------------------------------------------- : EOF // ----------------------------------------------------------------------------- : EOF
#endif #endif
...@@ -131,19 +131,7 @@ ScriptValueP Context::eval(const Script& script, bool useScope) { ...@@ -131,19 +131,7 @@ ScriptValueP Context::eval(const Script& script, bool useScope) {
const Instruction* instr_bt = script.backtraceSkip(instr - i.data - 2, i.data); const Instruction* instr_bt = script.backtraceSkip(instr - i.data - 2, i.data);
// have we have reached the name // have we have reached the name
if (instr_bt) { if (instr_bt) {
if (instr_bt->instr == I_GET_VAR) { throw ScriptError(e.what() + _("\n in function: ") + script.instructionName(instr_bt));
throw ScriptError(e.what() + _("\n in function: ") + variable_to_string(instr_bt->data));
} else if (instr_bt->instr == I_MEMBER_C) {
throw ScriptError(e.what() + _("\n in function: ??\?.") + script.constants[instr_bt->data]->operator String());
} else if (instr_bt->instr == I_BINARY && instr_bt->instr2 == I_MEMBER) {
throw ScriptError(e.what() + _("\n in function: ??\?[??\?]"));
} else if (instr_bt->instr == I_BINARY && instr_bt->instr2 == I_ADD) {
throw ScriptError(e.what() + _("\n in function: ??? + ???"));
} else if (instr_bt->instr == I_NOP || instr_bt->instr == I_CALL) {
throw ScriptError(e.what() + _("\n in function: ??\?(??\?)"));
} else {
throw ScriptError(e.what() + _("\n in function: ??\?"));
}
} else { } else {
throw e; // rethrow throw e; // rethrow
} }
......
...@@ -184,9 +184,13 @@ String Script::dumpInstr(unsigned int pos, Instruction i) const { ...@@ -184,9 +184,13 @@ String Script::dumpInstr(unsigned int pos, Instruction i) const {
// ----------------------------------------------------------------------------- : Backtracing // ----------------------------------------------------------------------------- : Backtracing
const Instruction* Script::backtraceSkip(const Instruction* instr, int to_skip) const { const Instruction* Script::backtraceSkip(const Instruction* instr, int to_skip) const {
unsigned int initial = instr - &instructions[0];
for (;instr >= &instructions[0] && for (;instr >= &instructions[0] &&
(to_skip || // we have something to skip (to_skip || // we have something to skip
instr >= &instructions[1] && (instr-1)->instr == I_JUMP // always look inside a jump instr >= &instructions[1] && (
(instr-1)->instr == I_JUMP // always look inside a jump
|| (instr-1)->instr == I_NOP // and skip nops
)
) ; --instr) { ) ; --instr) {
// skip an instruction // skip an instruction
switch (instr->instr) { switch (instr->instr) {
...@@ -205,6 +209,10 @@ const Instruction* Script::backtraceSkip(const Instruction* instr, int to_skip) ...@@ -205,6 +209,10 @@ const Instruction* Script::backtraceSkip(const Instruction* instr, int to_skip)
to_skip += 2 * instr->data - 1; to_skip += 2 * instr->data - 1;
break; break;
case I_JUMP: { case I_JUMP: {
if (instr->data > initial) {
// we were in an else branch all along, ignore this jump
return instr + 1;
}
// there will be a way not to take this jump // there will be a way not to take this jump
// the part in between will have no significant stack effect // the part in between will have no significant stack effect
unsigned int after_jump = instr + 1 - &instructions[0]; unsigned int after_jump = instr + 1 - &instructions[0];
...@@ -248,3 +256,24 @@ const Instruction* Script::backtraceSkip(const Instruction* instr, int to_skip) ...@@ -248,3 +256,24 @@ const Instruction* Script::backtraceSkip(const Instruction* instr, int to_skip)
} }
return instr >= &instructions[0] ? instr : nullptr; return instr >= &instructions[0] ? instr : nullptr;
} }
String Script::instructionName(const Instruction* instr) const {
if (instr < &instructions[0] || instr >= &instructions[instructions.size()]) return _("??\?");
if (instr->instr == I_GET_VAR) {
return variable_to_string(instr->data);
} else if (instr->instr == I_MEMBER_C) {
return instructionName(backtraceSkip(instr - 1, 0))
+ _(".")
+ constants[instr->data]->toString();
} else if (instr->instr == I_BINARY && instr->instr2 == I_MEMBER) {
throw _("??\?[...]");
} else if (instr->instr == I_BINARY && instr->instr2 == I_ADD) {
return _("??? + ???");
} else if (instr->instr == I_NOP) {
return _("??\?(...)");
} else if (instr->instr == I_CALL) {
return instructionName(backtraceSkip(instr - 1, instr->data)) + _("(...)");
} else {
return _("??\?");
}
}
...@@ -162,6 +162,8 @@ class Script : public ScriptValue { ...@@ -162,6 +162,8 @@ class Script : public ScriptValue {
* If the backtrace fails, returns nullptr * If the backtrace fails, returns nullptr
*/ */
const Instruction* backtraceSkip(const Instruction* instr, int to_skip) const; const Instruction* backtraceSkip(const Instruction* instr, int to_skip) const;
/// Find the name of an instruction
String instructionName(const Instruction* instr) const;
friend class Context; friend class Context;
}; };
......
...@@ -31,6 +31,14 @@ ScriptValueP make_iterator(const T& v) { ...@@ -31,6 +31,14 @@ ScriptValueP make_iterator(const T& v) {
template <typename T> template <typename T>
void mark_dependency_member(const T& value, const String& name, const Dependency& dep) {} void mark_dependency_member(const T& value, const String& name, const Dependency& dep) {}
/// Type name of an object, for error messages
template <typename T> inline String type_name(const T&) {
return _TYPE_("object");
}
template <typename K, typename V> inline String type_name(const pair<K,V>& p) {
return type_name(p.second); // for maps
}
// ----------------------------------------------------------------------------- : Errors // ----------------------------------------------------------------------------- : Errors
/// A delayed error message. /// A delayed error message.
...@@ -104,7 +112,7 @@ class ScriptCollection : public ScriptValue { ...@@ -104,7 +112,7 @@ class ScriptCollection : public ScriptValue {
public: public:
inline ScriptCollection(const Collection* v) : value(v) {} inline ScriptCollection(const Collection* v) : value(v) {}
virtual ScriptType type() const { return SCRIPT_COLLECTION; } virtual ScriptType type() const { return SCRIPT_COLLECTION; }
virtual String typeName() const { return _TYPE_("collection"); } virtual String typeName() const { return format_string(_TYPE_("collection"), type_name(*value->begin())); }
virtual ScriptValueP getMember(const String& name) const { virtual ScriptValueP getMember(const String& name) const {
long index; long index;
if (name.ToLong(&index) && index >= 0 && (size_t)index < value->size()) { if (name.ToLong(&index) && index >= 0 && (size_t)index < value->size()) {
...@@ -152,7 +160,7 @@ class ScriptMap : public ScriptValue { ...@@ -152,7 +160,7 @@ class ScriptMap : public ScriptValue {
public: public:
inline ScriptMap(const Collection* v) : value(v) {} inline ScriptMap(const Collection* v) : value(v) {}
virtual ScriptType type() const { return SCRIPT_COLLECTION; } virtual ScriptType type() const { return SCRIPT_COLLECTION; }
virtual String typeName() const { return _TYPE_("collection"); } virtual String typeName() const { return format_string(_TYPE_("collection"), type_name(value->begin())); }
virtual ScriptValueP getMember(const String& name) const { virtual ScriptValueP getMember(const String& name) const {
return get_member(*value, name); return get_member(*value, name);
} }
...@@ -195,7 +203,7 @@ class ScriptObject : public ScriptValue { ...@@ -195,7 +203,7 @@ class ScriptObject : public ScriptValue {
public: public:
inline ScriptObject(const T& v) : value(v) {} inline ScriptObject(const T& v) : value(v) {}
virtual ScriptType type() const { return SCRIPT_OBJECT; } virtual ScriptType type() const { return SCRIPT_OBJECT; }
virtual String typeName() const { return _TYPE_("object"); } virtual String typeName() const { return type_name(*value); }
virtual operator String() const { ScriptValueP d = getDefault(); return d ? *d : ScriptValue::operator String(); } virtual operator String() const { ScriptValueP d = getDefault(); return d ? *d : ScriptValue::operator String(); }
virtual operator double() const { ScriptValueP d = getDefault(); return d ? *d : ScriptValue::operator double(); } virtual operator double() const { ScriptValueP d = getDefault(); return d ? *d : ScriptValue::operator double(); }
virtual operator int() const { ScriptValueP d = getDefault(); return d ? *d : ScriptValue::operator int(); } virtual operator int() const { ScriptValueP d = getDefault(); return d ? *d : ScriptValue::operator int(); }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment