- struct IdentifierOffsetLess :
- std::binary_function<const IdentifierOffset &, const IdentifierOffset &, bool>
- {
- _finline bool operator ()(const IdentifierOffset &lhs, const IdentifierOffset &rhs) const {
- if (lhs.offset_ != rhs.offset_)
- return lhs.offset_ < rhs.offset_;
- if (lhs.flags_ != rhs.flags_)
- return lhs.flags_ < rhs.flags_;
- /*if (lhs.usage_ != rhs.usage_)
- return lhs.usage_ < rhs.usage_;*/
- return lhs.identifier_ < rhs.identifier_;
- }
- };
+ switch (kind) {
+ case CYIdentifierArgument:
+ case CYIdentifierCatch:
+ case CYIdentifierMagic:
+ _assert(false);
+ default:
+ break;
+ }
+
+ if (existing->kind_ == CYIdentifierGlobal)
+ existing->kind_ = kind;
+ else if (kind == CYIdentifierGlobal)
+ ;
+ else if (existing->kind_ == CYIdentifierLexical || kind == CYIdentifierLexical)
+ _assert(false); // XXX: throw new SyntaxError()
+
+ return existing;
+}
+
+void CYScope::Merge(CYContext &context, const CYIdentifierFlags *flags) {
+ _assert(flags->identifier_->next_ == flags->identifier_);
+ CYIdentifierFlags *existing(Declare(context, flags->identifier_, flags->kind_));
+ flags->identifier_->next_ = existing->identifier_;