diff --git a/src/Expr.cc b/src/Expr.cc index 77466f2a55..dbfca7c9cb 100644 --- a/src/Expr.cc +++ b/src/Expr.cc @@ -2611,7 +2611,6 @@ Val* AssignExpr::Eval(Frame* f) const if ( v ) { op1->Assign(f, v); - //### op1->SetAttribs(); return val ? val->Ref() : v->Ref(); } else @@ -3062,13 +3061,6 @@ FieldExpr::FieldExpr(Expr* arg_op, const char* arg_field_name) if ( IsError() ) return; - if ( streq(arg_field_name, "attr") ) - { - field = -1; - SetType(op->Type()->AttributesType()->Ref()); - return; - } - if ( ! IsRecord(op->Type()->Tag()) ) ExprError("not a record"); else @@ -3106,12 +3098,7 @@ void FieldExpr::Assign(Frame* f, Val* v, Opcode opcode) return; if ( field < 0 ) - { - Val* lhs = op->Eval(f); - lhs->SetAttribs(v->AsRecordVal()); - Unref(lhs); - return; - } + ExprError("no such field in record"); Val* op_v = op->Eval(f); if ( op_v ) @@ -3124,9 +3111,6 @@ void FieldExpr::Assign(Frame* f, Val* v, Opcode opcode) Val* FieldExpr::Fold(Val* v) const { - if ( field < 0 ) - return v->GetAttribs(true)->Ref(); - Val* result = v->AsRecordVal()->Lookup(field); if ( result ) return result->Ref(); @@ -3179,24 +3163,20 @@ bool FieldExpr::DoUnserialize(UnserialInfo* info) return td != 0; } -HasFieldExpr::HasFieldExpr(Expr* arg_op, const char* arg_field_name, - bool arg_is_attr) +HasFieldExpr::HasFieldExpr(Expr* arg_op, const char* arg_field_name) : UnaryExpr(EXPR_HAS_FIELD, arg_op) { field_name = arg_field_name; - is_attr = arg_is_attr; field = 0; if ( IsError() ) return; - if ( ! is_attr && ! IsRecord(op->Type()->Tag()) ) + if ( ! IsRecord(op->Type()->Tag()) ) ExprError("not a record"); else { - RecordType* rt = is_attr ? - op->Type()->AttributesType() : - op->Type()->AsRecordType(); + RecordType* rt = op->Type()->AsRecordType(); field = rt->FieldOffset(field_name); if ( field < 0 ) @@ -3215,10 +3195,7 @@ Val* HasFieldExpr::Fold(Val* v) const { RecordVal* rec_to_look_at; - if ( is_attr ) - rec_to_look_at = v->GetAttribs(false); - else - rec_to_look_at = v->AsRecordVal(); + rec_to_look_at = v->AsRecordVal(); if ( ! rec_to_look_at ) return new Val(0, TYPE_BOOL); @@ -3235,12 +3212,7 @@ void HasFieldExpr::ExprDescribe(ODesc* d) const op->Describe(d); if ( d->IsReadable() ) - { - if ( is_attr ) - d->Add("?$$"); - else - d->Add("?$"); - } + d->Add("?$"); if ( IsError() ) d->Add(""); @@ -3255,13 +3227,17 @@ IMPLEMENT_SERIAL(HasFieldExpr, SER_HAS_FIELD_EXPR); bool HasFieldExpr::DoSerialize(SerialInfo* info) const { DO_SERIALIZE(SER_HAS_FIELD_EXPR, UnaryExpr); - return SERIALIZE(is_attr) && SERIALIZE(field_name) && SERIALIZE(field); + + // Serialize the former "bool is_attr" first for backwards compatibility. + return SERIALIZE(false) && SERIALIZE(field_name) && SERIALIZE(field); } bool HasFieldExpr::DoUnserialize(UnserialInfo* info) { DO_UNSERIALIZE(UnaryExpr); - return UNSERIALIZE(&is_attr) && UNSERIALIZE_STR(&field_name, 0) && UNSERIALIZE(&field); + // Unserialize the former "bool is_attr" first for backwards compatibility. + bool not_used; + return UNSERIALIZE(¬_used) && UNSERIALIZE_STR(&field_name, 0) && UNSERIALIZE(&field); } RecordConstructorExpr::RecordConstructorExpr(ListExpr* constructor_list) @@ -3507,8 +3483,6 @@ Val* SetConstructorExpr::Eval(Frame* f) const aggr->Assign(element, 0); } - aggr->AsTableVal()->SetAttrs(attrs); - return aggr; } diff --git a/src/Expr.h b/src/Expr.h index c078d4651c..9c338a0f8a 100644 --- a/src/Expr.h +++ b/src/Expr.h @@ -709,7 +709,7 @@ protected: // "rec?$$attrname" is true if the attribute attrname is not nil. class HasFieldExpr : public UnaryExpr { public: - HasFieldExpr(Expr* op, const char* field_name, bool is_attr); + HasFieldExpr(Expr* op, const char* field_name); ~HasFieldExpr(); protected: diff --git a/src/Type.cc b/src/Type.cc index 1f5c22d58b..55794dfce5 100644 --- a/src/Type.cc +++ b/src/Type.cc @@ -10,20 +10,6 @@ #include "Scope.h" #include "Serializer.h" -RecordType* init_global_attrs(); - -bool in_global_attr_decl = false; -RecordType* global_attributes_type = init_global_attrs(); - -RecordType* init_global_attrs() - { - in_global_attr_decl = true; - RecordType* rt = new RecordType(new type_decl_list); - in_global_attr_decl = false; - rt->MakeGlobalAttributeType(); - return rt; - } - const char* type_name(TypeTag t) { static char errbuf[512]; @@ -58,7 +44,6 @@ BroType::BroType(TypeTag t, bool arg_base_type) tag = t; is_network_order = 0; base_type = arg_base_type; - is_global_attributes_type = false; switch ( tag ) { case TYPE_VOID: @@ -118,28 +103,6 @@ BroType::BroType(TypeTag t, bool arg_base_type) break; } - // Kind of hacky; we don't want an error while we're defining - // the global attrs! - if ( in_global_attr_decl ) - { - attributes_type = 0; - return; - } - - if ( ! global_attributes_type ) - SetError(); - else - attributes_type = global_attributes_type; - } - -bool BroType::SetAttributesType(type_decl_list* attr_types) - { - TypeList* global = new TypeList(); - global->Append(global_attributes_type); - - attributes_type = refine_type(global, attr_types)->AsRecordType(); - - return (attributes_type != 0); } int BroType::MatchesIndex(ListExpr*& /* index */) const @@ -241,16 +204,6 @@ BroType* BroType::Unserialize(UnserialInfo* info, TypeTag want) return t2; } - // For the global_attribute_type, we also return our current instance. - if ( t->is_global_attributes_type ) - { - BroType* t2 = global_attributes_type; - Unref(t); - t2->Ref(); - assert(t2); - return t2; - } - assert(t); return t; } @@ -267,10 +220,15 @@ bool BroType::DoSerialize(SerialInfo* info) const return false; if ( ! (SERIALIZE(is_network_order) && SERIALIZE(base_type) && - SERIALIZE(is_global_attributes_type)) ) + // Serialize the former "bool is_global_attributes_type" for + // backwards compatibility. + SERIALIZE(false)) ) return false; - SERIALIZE_OPTIONAL(attributes_type); + // Likewise, serialize the former optional "RecordType* attributes_type" + // for backwards compatibility. + void* null = NULL; + SERIALIZE(null); info->s->WriteCloseTag("Type"); @@ -288,13 +246,19 @@ bool BroType::DoUnserialize(UnserialInfo* info) tag = (TypeTag) c1; internal_tag = (InternalTypeTag) c2; + bool not_used; + if ( ! (UNSERIALIZE(&is_network_order) && UNSERIALIZE(&base_type) - && UNSERIALIZE(&is_global_attributes_type)) ) + // Unerialize the former "bool is_global_attributes_type" for + // backwards compatibility. + && UNSERIALIZE(¬_used)) ) return 0; - BroType* type; - UNSERIALIZE_OPTIONAL(type, BroType::Unserialize(info, TYPE_RECORD)); - attributes_type = (RecordType*) type; + BroType* not_used_either; + + // Likewise, unserialize the former optional "RecordType* + // attributes_type" for backwards compatibility. + UNSERIALIZE_OPTIONAL(not_used_either, BroType::Unserialize(info, TYPE_RECORD)); return true; } @@ -721,9 +685,6 @@ TypeDecl::TypeDecl(BroType* t, const char* i, attr_list* arg_attrs) type = t; attrs = arg_attrs ? new Attributes(arg_attrs, t) : 0; id = i; - - if ( in_global_attr_decl && ! attrs->FindAttr(ATTR_DEFAULT) ) - error("global attribute types must have default values"); } TypeDecl::~TypeDecl() diff --git a/src/Type.h b/src/Type.h index 7778fabc1e..ff4d3df9e6 100644 --- a/src/Type.h +++ b/src/Type.h @@ -60,9 +60,6 @@ class EnumType; class Serializer; class VectorType; -extern bool in_global_attr_decl; -extern RecordType* global_attributes_type; - const int DOES_NOT_MATCH_INDEX = 0; const int MATCHES_INDEX_SCALAR = 1; const int MATCHES_INDEX_VECTOR = 2; @@ -74,15 +71,6 @@ public: TypeTag Tag() const { return tag; } InternalTypeTag InternalType() const { return internal_tag; } - // Type for the attributes (metadata) on this type. - RecordType* AttributesType() - { - if ( ! attributes_type ) - attributes_type = global_attributes_type; - return attributes_type; - } - bool SetAttributesType(type_decl_list* attr_types); - // Whether it's stored in network order. int IsNetworkOrder() const { return is_network_order; } @@ -211,8 +199,6 @@ public: BroType* Ref() { ::Ref(this); return this; } - void MakeGlobalAttributeType() { is_global_attributes_type = true; } - virtual void Describe(ODesc* d) const; virtual unsigned MemoryAllocation() const; @@ -221,7 +207,7 @@ public: static BroType* Unserialize(UnserialInfo* info, TypeTag want = TYPE_ANY); protected: - BroType() { attributes_type = 0; } + BroType() { } void SetError(); @@ -232,8 +218,6 @@ private: InternalTypeTag internal_tag; bool is_network_order; bool base_type; - bool is_global_attributes_type; - RecordType* attributes_type; }; class TypeList : public BroType { diff --git a/src/Val.cc b/src/Val.cc index f43bafe4d7..4519d76f30 100644 --- a/src/Val.cc +++ b/src/Val.cc @@ -414,15 +414,6 @@ bool Val::DoUnserialize(UnserialInfo* info) return false; } -RecordVal* Val::GetAttribs(bool instantiate) - { - if ( ! instantiate || attribs ) - return attribs; - - attribs = new RecordVal(type->AttributesType()); - return attribs; - } - int Val::IsZero() const { switch ( type->InternalType() ) { diff --git a/src/Val.h b/src/Val.h index 5a2faee9d7..d21562c907 100644 --- a/src/Val.h +++ b/src/Val.h @@ -178,13 +178,6 @@ public: Val* Ref() { ::Ref(this); return this; } virtual Val* Clone() const; - RecordVal* GetAttribs(bool instantiate); - void SetAttribs(RecordVal* arg_attribs) - { - Unref((Val*) attribs); - attribs = arg_attribs; - } - int IsZero() const; int IsOne() const; diff --git a/src/parse.y b/src/parse.y index b0bb39f0ea..3cf2c07b18 100644 --- a/src/parse.y +++ b/src/parse.y @@ -8,7 +8,7 @@ %token TOK_BOOL TOK_BREAK TOK_CASE TOK_CONST %token TOK_CONSTANT TOK_COPY TOK_COUNT TOK_COUNTER TOK_DEFAULT TOK_DELETE %token TOK_DOUBLE TOK_ELSE TOK_ENUM TOK_EVENT TOK_EXPORT TOK_FILE TOK_FOR -%token TOK_FUNCTION TOK_GLOBAL TOK_GLOBAL_ATTR TOK_ID TOK_IF TOK_INT +%token TOK_FUNCTION TOK_GLOBAL TOK_ID TOK_IF TOK_INT %token TOK_INTERVAL TOK_LIST TOK_LOCAL TOK_MODULE TOK_MATCH TOK_NET %token TOK_NEXT TOK_OF TOK_PATTERN TOK_PATTERN_TEXT %token TOK_PORT TOK_PRINT TOK_RECORD TOK_REDEF @@ -53,7 +53,7 @@ %type func_hdr func_params %type type_list %type type_decl formal_args_decl -%type type_decl_list formal_args_decl_list opt_attr_attr +%type type_decl_list formal_args_decl_list %type formal_args %type expr_list opt_expr_list %type case @@ -417,13 +417,7 @@ expr: | expr TOK_HAS_FIELD TOK_ID { set_location(@1, @3); - $$ = new HasFieldExpr($1, $3, false); - } - - | expr TOK_HAS_ATTR TOK_ID - { - set_location(@1, @3); - $$ = new HasFieldExpr($1, $3, true); + $$ = new HasFieldExpr($1, $3); } | anonymous_function @@ -821,17 +815,9 @@ decl: } } - | TOK_TYPE global_id ':' refined_type opt_attr opt_attr_attr ';' + | TOK_TYPE global_id ':' refined_type opt_attr ';' { add_type($2, $4, $5, 0); - if ( $6 ) - $2->AsType()->SetAttributesType($6); - } - - | TOK_GLOBAL_ATTR ':' { in_global_attr_decl = true; } - '{' type_decl_list '}' ';' { in_global_attr_decl = false; } - { - global_attributes_type = new RecordType($5); } | TOK_EVENT event_id ':' refined_type opt_attr ';' @@ -856,13 +842,6 @@ conditional: { do_atelse(); } ; -opt_attr_attr: - TOK_ATTR_ATTR '=' '{' type_decl_list '}' - { $$ = $4; } - | - { $$ = 0; } - ; - func_hdr: TOK_FUNCTION global_id func_params { diff --git a/src/scan.l b/src/scan.l index 0d479dc44e..9dc4d828e0 100644 --- a/src/scan.l +++ b/src/scan.l @@ -151,9 +151,7 @@ file return TOK_FILE; for return TOK_FOR; function return TOK_FUNCTION; global return TOK_GLOBAL; -global_attr return TOK_GLOBAL_ATTR; "?$" return TOK_HAS_FIELD; -"?$$" return TOK_HAS_ATTR; if return TOK_IF; in return TOK_IN; "!"{OWS}in/[^A-Za-z0-9] return TOK_NOT_IN; /* don't confuse w "! infoo"! */