Changeset fd782b2
- Timestamp:
- Sep 15, 2016, 10:55:52 AM (9 years ago)
- Branches:
- ADT, aaron-thesis, arm-eh, ast-experimental, cleanup-dtors, deferred_resn, demangler, enum, forall-pointer-decay, jacob/cs343-translation, jenkins-sandbox, master, new-ast, new-ast-unique-expr, new-env, no_list, persistent-indexer, pthread-emulation, qualifiedEnum, resolv-new, with_gc
- Children:
- aa8f9df
- Parents:
- f006f01 (diff), 1eba452 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)
links above to see all the changes relative to each parent. - Location:
- src
- Files:
-
- 1 added
- 24 edited
Legend:
- Unmodified
- Added
- Removed
-
src/InitTweak/InitTweak.cc
rf006f01 rfd782b2 387 387 } else if ( MemberExpr * memberExpr = dynamic_cast< MemberExpr * >( func ) ) { 388 388 return memberExpr->get_member()->get_name(); 389 } else if ( UntypedMemberExpr * memberExpr = dynamic_cast< UntypedMemberExpr * > ( func ) ) { 390 return funcName( memberExpr->get_member() ); 389 391 } else { 390 392 assertf( false, "Unexpected expression type being called as a function in call expression" ); -
src/Parser/DeclarationNode.cc
rf006f01 rfd782b2 10 10 // Created On : Sat May 16 12:34:05 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Fri Sep 9 23:21:47201613 // Update Count : 4 0212 // Last Modified On : Sun Sep 11 09:24:11 2016 13 // Update Count : 438 14 14 // 15 15 … … 31 31 32 32 // These must remain in the same order as the corresponding DeclarationNode enumerations. 33 const char *DeclarationNode::storageName[] = { "extern", "static", "auto", "register", "inline", "fortran", "_Noreturn", "_Thread_local", " " };33 const char *DeclarationNode::storageName[] = { "extern", "static", "auto", "register", "inline", "fortran", "_Noreturn", "_Thread_local", "NoStorageClass" }; 34 34 const char *DeclarationNode::qualifierName[] = { "const", "restrict", "volatile", "lvalue", "_Atomic" }; 35 35 const char *DeclarationNode::basicTypeName[] = { "char", "int", "float", "double", "void", "_Bool", "_Complex", "_Imaginary", }; … … 389 389 390 390 void DeclarationNode::checkQualifiers( const TypeData *src, const TypeData *dst ) { 391 TypeData::Qualifiers qsrc = src->qualifiers, qdst = dst->qualifiers; 392 393 if ( (qsrc & qdst).any() ) { // common bits between qualifier masks?391 TypeData::Qualifiers qsrc = src->qualifiers, qdst = dst->qualifiers; // optimization 392 393 if ( (qsrc & qdst).any() ) { // common qualifier ? 394 394 for ( int i = 0; i < NoOfQualifier; i += 1 ) { // find common qualifiers 395 395 if ( qsrc[i] & qdst[i] ) { 396 error += string(error.empty() ? "" : ", ") + "duplicate " + DeclarationNode::qualifierName[i]; 396 if ( ! error.empty() ) error += ", "; // separator 397 error += string( "duplicate " ) + DeclarationNode::qualifierName[i]; 397 398 } // if 398 399 } // for 399 400 } // if 400 401 } // DeclarationNode::checkQualifiers 402 403 void DeclarationNode::checkStorageClasses( DeclarationNode *q ) { 404 if ( storageClass != NoStorageClass && q->storageClass != NoStorageClass ) { 405 if ( ! error.empty() ) error += ", "; // separator 406 if ( storageClass == q->storageClass ) { // duplicate qualifier 407 error += string( "duplicate " ) + storageName[ storageClass ]; 408 } else { // only one storage class 409 error += string( "conflicting " ) + storageName[ storageClass ] + " & " + storageName[ q->storageClass ]; 410 q->storageClass = storageClass; // FIX ERROR 411 } // if 412 if ( ! q->error.empty() ) error += ", " + q->error; // separator 413 } else { 414 if ( ! error.empty() ) { 415 if ( ! q->error.empty() ) error += ", " + q->error; // separator 416 } else if ( ! q->error.empty() ) error += q->error; 417 } // if 418 } // DeclarationNode::copyStorageClasses 419 420 DeclarationNode *DeclarationNode::copyStorageClasses( DeclarationNode *q ) { 421 isInline = isInline | q->isInline; 422 isNoreturn = isNoreturn | q->isNoreturn; 423 // do not overwrite an existing value with NoStorageClass 424 if ( q->storageClass != NoStorageClass ) { 425 assert( storageClass == NoStorageClass || storageClass == q->storageClass ); 426 storageClass = q->storageClass; 427 } // if 428 return this; 429 } // DeclarationNode::copyStorageClasses 401 430 402 431 DeclarationNode *DeclarationNode::addQualifiers( DeclarationNode *q ) { 403 432 if ( q ) { 404 copyStorageClasses(q); 433 checkStorageClasses( q ); 434 copyStorageClasses( q ); 405 435 if ( q->type ) { 406 436 if ( ! type ) { … … 429 459 return this; 430 460 } 431 432 DeclarationNode *DeclarationNode::copyStorageClasses( DeclarationNode *q ) {433 isInline = isInline || q->isInline;434 isNoreturn = isNoreturn || q->isNoreturn;435 if ( storageClass == NoStorageClass ) {436 storageClass = q->storageClass;437 } else if ( q->storageClass != NoStorageClass ) {438 if ( storageClass == q->storageClass ) {439 q->error += string( "duplicate " ) + storageName[ storageClass ];440 } else { // can only have one storage class441 q->error += string( "multiple " ) + storageName[ storageClass ] + " & " + storageName[ q->storageClass ];442 } // if443 } // if444 if ( ! q->error.empty() ) {445 error += (! error.empty() ? ", " : "") + q->error;446 } // if447 return this;448 } // DeclarationNode::copyStorageClasses449 461 450 462 static void addTypeToType( TypeData *&src, TypeData *&dst ) { … … 504 516 DeclarationNode *DeclarationNode::addType( DeclarationNode *o ) { 505 517 if ( o ) { 518 checkStorageClasses( o ); 506 519 copyStorageClasses( o ); 507 520 if ( o->type ) { … … 751 764 } // if 752 765 newnode->type->forall = maybeClone( type->forall ); 766 assert( storageClass == NoStorageClass ); 753 767 newnode->copyStorageClasses( this ); 754 768 newnode->name = assign_strptr( newName ); … … 791 805 DeclarationNode *newnode = new DeclarationNode; 792 806 newnode->type = maybeClone( type ); 807 assert( storageClass == NoStorageClass ); 793 808 newnode->copyStorageClasses( this ); 794 809 newnode->name = assign_strptr( newName ); … … 798 813 DeclarationNode *DeclarationNode::cloneType( DeclarationNode *o ) { 799 814 if ( o ) { 815 assert( storageClass == NoStorageClass ); 800 816 o->copyStorageClasses( this ); 801 817 if ( type ) { -
src/Parser/ParseNode.h
rf006f01 rfd782b2 10 10 // Created On : Sat May 16 13:28:16 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Thu Sep 8 21:58:06201613 // Update Count : 58 712 // Last Modified On : Sat Sep 10 17:14:37 2016 13 // Update Count : 589 14 14 // 15 15 … … 41 41 public: 42 42 ParseNode() {}; 43 ParseNode( const std::string * name ) : name( *name ) { assert( false ); delete name; }43 ParseNode( const std::string * name ) : name( * name ) { assert( false ); delete name; } 44 44 ParseNode( const std::string &name ) : name( name ) { assert( false ); } 45 45 virtual ~ParseNode() { delete next; }; 46 virtual ParseNode * clone() const = 0;47 48 ParseNode * get_next() const { return next; }49 ParseNode * set_next( ParseNode *newlink ) { next = newlink; return this; }50 ParseNode * get_last() {51 ParseNode * current;46 virtual ParseNode * clone() const = 0; 47 48 ParseNode * get_next() const { return next; } 49 ParseNode * set_next( ParseNode * newlink ) { next = newlink; return this; } 50 ParseNode * get_last() { 51 ParseNode * current; 52 52 for ( current = this; current->get_next() != 0; current = current->get_next() ); 53 53 return current; 54 54 } 55 ParseNode * set_last( ParseNode *newlast ) {55 ParseNode * set_last( ParseNode * newlast ) { 56 56 if ( newlast != 0 ) get_last()->set_next( newlast ); 57 57 return this; … … 66 66 static int indent_by; 67 67 68 ParseNode * next = nullptr;68 ParseNode * next = nullptr; 69 69 std::string name; 70 70 }; // ParseNode … … 74 74 class InitializerNode : public ParseNode { 75 75 public: 76 InitializerNode( ExpressionNode *, bool aggrp = false, ExpressionNode * des = 0 );77 InitializerNode( InitializerNode *, bool aggrp = false, ExpressionNode * des = 0 );76 InitializerNode( ExpressionNode *, bool aggrp = false, ExpressionNode * des = 0 ); 77 InitializerNode( InitializerNode *, bool aggrp = false, ExpressionNode * des = 0 ); 78 78 ~InitializerNode(); 79 virtual InitializerNode * clone() const { assert( false ); return nullptr; }80 81 ExpressionNode * get_expression() const { return expr; }82 83 InitializerNode * set_designators( ExpressionNode *des ) { designator = des; return this; }84 ExpressionNode * get_designators() const { return designator; }85 86 InitializerNode * set_maybeConstructed( bool value ) { maybeConstructed = value; return this; }79 virtual InitializerNode * clone() const { assert( false ); return nullptr; } 80 81 ExpressionNode * get_expression() const { return expr; } 82 83 InitializerNode * set_designators( ExpressionNode * des ) { designator = des; return this; } 84 ExpressionNode * get_designators() const { return designator; } 85 86 InitializerNode * set_maybeConstructed( bool value ) { maybeConstructed = value; return this; } 87 87 bool get_maybeConstructed() const { return maybeConstructed; } 88 88 89 InitializerNode * next_init() const { return kids; }89 InitializerNode * next_init() const { return kids; } 90 90 91 91 void print( std::ostream &os, int indent = 0 ) const; 92 92 void printOneLine( std::ostream & ) const; 93 93 94 virtual Initializer * build() const;94 virtual Initializer * build() const; 95 95 private: 96 ExpressionNode * expr;96 ExpressionNode * expr; 97 97 bool aggregate; 98 ExpressionNode * designator;// may be list99 InitializerNode * kids;98 ExpressionNode * designator; // may be list 99 InitializerNode * kids; 100 100 bool maybeConstructed; 101 101 }; // InitializerNode … … 106 106 public: 107 107 ExpressionNode( Expression * expr = nullptr ) : expr( expr ) {} 108 ExpressionNode( Expression * expr, const std::string * name ) : ParseNode( name ), expr( expr ) {}108 ExpressionNode( Expression * expr, const std::string * name ) : ParseNode( name ), expr( expr ) {} 109 109 ExpressionNode( const ExpressionNode &other ); 110 110 virtual ~ExpressionNode() {} 111 virtual ExpressionNode * clone() const { return expr ? new ExpressionNode( expr->clone() ) : nullptr; }111 virtual ExpressionNode * clone() const { return expr ? new ExpressionNode( expr->clone() ) : nullptr; } 112 112 113 113 bool get_extension() const { return extension; } 114 ExpressionNode * set_extension( bool exten ) { extension = exten; return this; }114 ExpressionNode * set_extension( bool exten ) { extension = exten; return this; } 115 115 116 116 void print( std::ostream &os, int indent = 0 ) const {} … … 122 122 } 123 123 124 Expression * build() const { return const_cast<ExpressionNode*>(this)->expr.release(); }124 Expression * build() const { return const_cast<ExpressionNode*>(this)->expr.release(); } 125 125 private: 126 126 bool extension = false; … … 130 130 template< typename T > 131 131 struct maybeBuild_t< Expression, T > { 132 static inline Expression * doit( const T * orig ) {132 static inline Expression * doit( const T * orig ) { 133 133 if ( orig ) { 134 Expression * p = orig->build();134 Expression * p = orig->build(); 135 135 p->set_extension( orig->get_extension() ); 136 136 return p; … … 156 156 }; 157 157 158 Expression * build_constantInteger( const std::string &str );159 Expression * build_constantFloat( const std::string &str );160 Expression * build_constantChar( const std::string &str );161 ConstantExpr * build_constantStr( const std::string &str );162 163 NameExpr * build_varref( const std::string *name, bool labelp = false );164 Expression * build_typevalue( DeclarationNode *decl );165 166 Expression * build_cast( DeclarationNode * decl_node, ExpressionNode *expr_node );167 Expression * build_fieldSel( ExpressionNode *expr_node, Expression *member );168 Expression * build_pfieldSel( ExpressionNode *expr_node, Expression *member );169 Expression * build_addressOf( ExpressionNode *expr_node );170 Expression * build_sizeOfexpr( ExpressionNode *expr_node );171 Expression * build_sizeOftype( DeclarationNode *decl_node );172 Expression * build_alignOfexpr( ExpressionNode *expr_node );173 Expression * build_alignOftype( DeclarationNode *decl_node );174 Expression * build_offsetOf( DeclarationNode *decl_node, NameExpr *member );175 Expression * build_and( ExpressionNode *expr_node1, ExpressionNode *expr_node2 );176 Expression * build_and_or( ExpressionNode *expr_node1, ExpressionNode *expr_node2, bool kind );177 Expression * build_unary_val( OperKinds op, ExpressionNode *expr_node );178 Expression * build_unary_ptr( OperKinds op, ExpressionNode *expr_node );179 Expression * build_binary_val( OperKinds op, ExpressionNode *expr_node1, ExpressionNode *expr_node2 );180 Expression * build_binary_ptr( OperKinds op, ExpressionNode *expr_node1, ExpressionNode *expr_node2 );181 Expression * build_cond( ExpressionNode *expr_node1, ExpressionNode *expr_node2, ExpressionNode *expr_node3 );182 Expression * build_comma( ExpressionNode *expr_node1, ExpressionNode *expr_node2 );183 Expression * build_attrexpr( NameExpr *var, ExpressionNode * expr_node );184 Expression * build_attrtype( NameExpr *var, DeclarationNode * decl_node );185 Expression * build_tuple( ExpressionNode * expr_node = 0 );186 Expression * build_func( ExpressionNode * function, ExpressionNode * expr_node );187 Expression * build_range( ExpressionNode * low, ExpressionNode *high );188 Expression * build_asmexpr( ExpressionNode *inout, ConstantExpr *constraint, ExpressionNode *operand );189 Expression * build_valexpr( StatementNode *s );190 Expression * build_compoundLiteral( DeclarationNode *decl_node, InitializerNode *kids );158 Expression * build_constantInteger( const std::string &str ); 159 Expression * build_constantFloat( const std::string &str ); 160 Expression * build_constantChar( const std::string &str ); 161 ConstantExpr * build_constantStr( const std::string &str ); 162 163 NameExpr * build_varref( const std::string * name, bool labelp = false ); 164 Expression * build_typevalue( DeclarationNode * decl ); 165 166 Expression * build_cast( DeclarationNode * decl_node, ExpressionNode * expr_node ); 167 Expression * build_fieldSel( ExpressionNode * expr_node, Expression * member ); 168 Expression * build_pfieldSel( ExpressionNode * expr_node, Expression * member ); 169 Expression * build_addressOf( ExpressionNode * expr_node ); 170 Expression * build_sizeOfexpr( ExpressionNode * expr_node ); 171 Expression * build_sizeOftype( DeclarationNode * decl_node ); 172 Expression * build_alignOfexpr( ExpressionNode * expr_node ); 173 Expression * build_alignOftype( DeclarationNode * decl_node ); 174 Expression * build_offsetOf( DeclarationNode * decl_node, NameExpr * member ); 175 Expression * build_and( ExpressionNode * expr_node1, ExpressionNode * expr_node2 ); 176 Expression * build_and_or( ExpressionNode * expr_node1, ExpressionNode * expr_node2, bool kind ); 177 Expression * build_unary_val( OperKinds op, ExpressionNode * expr_node ); 178 Expression * build_unary_ptr( OperKinds op, ExpressionNode * expr_node ); 179 Expression * build_binary_val( OperKinds op, ExpressionNode * expr_node1, ExpressionNode * expr_node2 ); 180 Expression * build_binary_ptr( OperKinds op, ExpressionNode * expr_node1, ExpressionNode * expr_node2 ); 181 Expression * build_cond( ExpressionNode * expr_node1, ExpressionNode * expr_node2, ExpressionNode * expr_node3 ); 182 Expression * build_comma( ExpressionNode * expr_node1, ExpressionNode * expr_node2 ); 183 Expression * build_attrexpr( NameExpr * var, ExpressionNode * expr_node ); 184 Expression * build_attrtype( NameExpr * var, DeclarationNode * decl_node ); 185 Expression * build_tuple( ExpressionNode * expr_node = 0 ); 186 Expression * build_func( ExpressionNode * function, ExpressionNode * expr_node ); 187 Expression * build_range( ExpressionNode * low, ExpressionNode * high ); 188 Expression * build_asmexpr( ExpressionNode * inout, ConstantExpr * constraint, ExpressionNode * operand ); 189 Expression * build_valexpr( StatementNode * s ); 190 Expression * build_compoundLiteral( DeclarationNode * decl_node, InitializerNode * kids ); 191 191 192 192 //############################################################################## … … 204 204 enum BuiltinType { Valist }; 205 205 206 static const char * qualifierName[];207 static const char * storageName[];208 static const char * basicTypeName[];209 static const char * modifierName[];210 static const char * aggregateName[];211 static const char * typeClassName[];212 static const char * builtinTypeName[];213 214 static DeclarationNode * newFunction( std::string *name, DeclarationNode *ret, DeclarationNode *param, StatementNode *body, bool newStyle = false );215 static DeclarationNode * newQualifier( Qualifier );216 static DeclarationNode * newForall( DeclarationNode *);217 static DeclarationNode * newStorageClass( StorageClass );218 static DeclarationNode * newBasicType( BasicType );219 static DeclarationNode * newModifier( Modifier );220 static DeclarationNode * newBuiltinType( BuiltinType );221 static DeclarationNode * newFromTypedef( std::string *);222 static DeclarationNode * newAggregate( Aggregate kind, const std::string *name, ExpressionNode *actuals, DeclarationNode *fields, bool body );223 static DeclarationNode * newEnum( std::string *name, DeclarationNode *constants );224 static DeclarationNode * newEnumConstant( std::string *name, ExpressionNode *constant );225 static DeclarationNode * newName( std::string *);226 static DeclarationNode * newFromTypeGen( std::string *, ExpressionNode *params );227 static DeclarationNode * newTypeParam( TypeClass, std::string *);228 static DeclarationNode * newTrait( std::string *name, DeclarationNode *params, DeclarationNode *asserts );229 static DeclarationNode * newTraitUse( std::string *name, ExpressionNode *params );230 static DeclarationNode * newTypeDecl( std::string *name, DeclarationNode *typeParams );231 static DeclarationNode * newPointer( DeclarationNode *qualifiers );232 static DeclarationNode * newArray( ExpressionNode *size, DeclarationNode *qualifiers, bool isStatic );233 static DeclarationNode * newVarArray( DeclarationNode *qualifiers );234 static DeclarationNode * newBitfield( ExpressionNode *size );235 static DeclarationNode * newTuple( DeclarationNode *members );236 static DeclarationNode * newTypeof( ExpressionNode *expr );237 static DeclarationNode * newAttr( std::string *, ExpressionNode *expr );238 static DeclarationNode * newAttr( std::string *, DeclarationNode *type );206 static const char * qualifierName[]; 207 static const char * storageName[]; 208 static const char * basicTypeName[]; 209 static const char * modifierName[]; 210 static const char * aggregateName[]; 211 static const char * typeClassName[]; 212 static const char * builtinTypeName[]; 213 214 static DeclarationNode * newFunction( std::string * name, DeclarationNode * ret, DeclarationNode * param, StatementNode * body, bool newStyle = false ); 215 static DeclarationNode * newQualifier( Qualifier ); 216 static DeclarationNode * newForall( DeclarationNode *); 217 static DeclarationNode * newStorageClass( StorageClass ); 218 static DeclarationNode * newBasicType( BasicType ); 219 static DeclarationNode * newModifier( Modifier ); 220 static DeclarationNode * newBuiltinType( BuiltinType ); 221 static DeclarationNode * newFromTypedef( std::string *); 222 static DeclarationNode * newAggregate( Aggregate kind, const std::string * name, ExpressionNode * actuals, DeclarationNode * fields, bool body ); 223 static DeclarationNode * newEnum( std::string * name, DeclarationNode * constants ); 224 static DeclarationNode * newEnumConstant( std::string * name, ExpressionNode * constant ); 225 static DeclarationNode * newName( std::string *); 226 static DeclarationNode * newFromTypeGen( std::string *, ExpressionNode * params ); 227 static DeclarationNode * newTypeParam( TypeClass, std::string *); 228 static DeclarationNode * newTrait( std::string * name, DeclarationNode * params, DeclarationNode * asserts ); 229 static DeclarationNode * newTraitUse( std::string * name, ExpressionNode * params ); 230 static DeclarationNode * newTypeDecl( std::string * name, DeclarationNode * typeParams ); 231 static DeclarationNode * newPointer( DeclarationNode * qualifiers ); 232 static DeclarationNode * newArray( ExpressionNode * size, DeclarationNode * qualifiers, bool isStatic ); 233 static DeclarationNode * newVarArray( DeclarationNode * qualifiers ); 234 static DeclarationNode * newBitfield( ExpressionNode * size ); 235 static DeclarationNode * newTuple( DeclarationNode * members ); 236 static DeclarationNode * newTypeof( ExpressionNode * expr ); 237 static DeclarationNode * newAttr( std::string *, ExpressionNode * expr ); 238 static DeclarationNode * newAttr( std::string *, DeclarationNode * type ); 239 239 240 240 DeclarationNode(); 241 241 ~DeclarationNode(); 242 DeclarationNode * clone() const;243 244 DeclarationNode * addQualifiers( DeclarationNode *);242 DeclarationNode * clone() const; 243 244 DeclarationNode * addQualifiers( DeclarationNode *); 245 245 void checkQualifiers( const TypeData *, const TypeData * ); 246 DeclarationNode *copyStorageClasses( DeclarationNode *); 247 DeclarationNode *addType( DeclarationNode *); 248 DeclarationNode *addTypedef(); 249 DeclarationNode *addAssertions( DeclarationNode *); 250 DeclarationNode *addName( std::string *); 251 DeclarationNode *addBitfield( ExpressionNode *size ); 252 DeclarationNode *addVarArgs(); 253 DeclarationNode *addFunctionBody( StatementNode *body ); 254 DeclarationNode *addOldDeclList( DeclarationNode *list ); 255 DeclarationNode *addPointer( DeclarationNode *qualifiers ); 256 DeclarationNode *addArray( DeclarationNode *array ); 257 DeclarationNode *addNewPointer( DeclarationNode *pointer ); 258 DeclarationNode *addNewArray( DeclarationNode *array ); 259 DeclarationNode *addParamList( DeclarationNode *list ); 260 DeclarationNode *addIdList( DeclarationNode *list ); // old-style functions 261 DeclarationNode *addInitializer( InitializerNode *init ); 262 263 DeclarationNode *cloneType( std::string *newName ); 264 DeclarationNode *cloneType( DeclarationNode *existing ); 265 DeclarationNode *cloneType( int ) { return cloneType( ( std::string *)0 ); } 266 DeclarationNode *cloneBaseType( std::string *newName ); 267 DeclarationNode *cloneBaseType( DeclarationNode *newdecl ); 268 269 DeclarationNode *appendList( DeclarationNode *node ) { 246 void checkStorageClasses( DeclarationNode *q ); 247 DeclarationNode * copyStorageClasses( DeclarationNode *); 248 DeclarationNode * addType( DeclarationNode *); 249 DeclarationNode * addTypedef(); 250 DeclarationNode * addAssertions( DeclarationNode *); 251 DeclarationNode * addName( std::string *); 252 DeclarationNode * addBitfield( ExpressionNode * size ); 253 DeclarationNode * addVarArgs(); 254 DeclarationNode * addFunctionBody( StatementNode * body ); 255 DeclarationNode * addOldDeclList( DeclarationNode * list ); 256 DeclarationNode * addPointer( DeclarationNode * qualifiers ); 257 DeclarationNode * addArray( DeclarationNode * array ); 258 DeclarationNode * addNewPointer( DeclarationNode * pointer ); 259 DeclarationNode * addNewArray( DeclarationNode * array ); 260 DeclarationNode * addParamList( DeclarationNode * list ); 261 DeclarationNode * addIdList( DeclarationNode * list ); // old-style functions 262 DeclarationNode * addInitializer( InitializerNode * init ); 263 264 DeclarationNode * cloneType( std::string * newName ); 265 DeclarationNode * cloneType( DeclarationNode * existing ); 266 DeclarationNode * cloneType( int ) { return cloneType( ( std::string *)0 ); } 267 DeclarationNode * cloneBaseType( std::string * newName ); 268 DeclarationNode * cloneBaseType( DeclarationNode * newdecl ); 269 270 DeclarationNode * appendList( DeclarationNode * node ) { 270 271 return (DeclarationNode *)set_last( node ); 271 272 } … … 274 275 void printList( std::ostream &os, int indent = 0 ) const; 275 276 276 Declaration * build() const;277 ::Type * buildType() const;277 Declaration * build() const; 278 ::Type * buildType() const; 278 279 279 280 bool get_hasEllipsis() const; 280 281 const std::string &get_name() const { return name; } 281 282 LinkageSpec::Spec get_linkage() const { return linkage; } 282 DeclarationNode * extractAggregate() const;283 DeclarationNode * extractAggregate() const; 283 284 bool has_enumeratorValue() const { return (bool)enumeratorValue; } 284 ExpressionNode * consume_enumeratorValue() const { return const_cast<DeclarationNode*>(this)->enumeratorValue.release(); }285 ExpressionNode * consume_enumeratorValue() const { return const_cast<DeclarationNode*>(this)->enumeratorValue.release(); } 285 286 286 287 bool get_extension() const { return extension; } 287 DeclarationNode * set_extension( bool exten ) { extension = exten; return this; }288 DeclarationNode * set_extension( bool exten ) { extension = exten; return this; } 288 289 public: 289 290 // StorageClass buildStorageClass() const; … … 306 307 BuiltinType builtin; 307 308 308 TypeData * type;309 TypeData * type; 309 310 std::string name; 310 311 // std::list< StorageClass > storageClasses; … … 312 313 bool isInline, isNoreturn; 313 314 std::list< std::string > attributes; 314 ExpressionNode * bitfieldWidth;315 ExpressionNode * bitfieldWidth; 315 316 std::unique_ptr<ExpressionNode> enumeratorValue; 316 InitializerNode * initializer;317 InitializerNode * initializer; 317 318 bool hasEllipsis; 318 319 LinkageSpec::Spec linkage; … … 323 324 }; // DeclarationNode 324 325 325 Type * buildType( TypeData *type );326 Type * buildType( TypeData * type ); 326 327 //Type::Qualifiers buildQualifiers( const TypeData::Qualifiers & qualifiers ); 327 328 328 static inline Type * maybeMoveBuildType( const DeclarationNode * orig ) {329 static inline Type * maybeMoveBuildType( const DeclarationNode * orig ) { 329 330 Type* ret = orig ? orig->buildType() : nullptr; 330 331 delete orig; … … 337 338 public: 338 339 StatementNode() { stmt = nullptr; } 339 StatementNode( Statement * stmt ) : stmt( stmt ) {}340 StatementNode( DeclarationNode * decl );340 StatementNode( Statement * stmt ) : stmt( stmt ) {} 341 StatementNode( DeclarationNode * decl ); 341 342 virtual ~StatementNode() {} 342 343 343 virtual StatementNode * clone() const final { assert( false ); return nullptr; }344 Statement * build() const { return const_cast<StatementNode*>(this)->stmt.release(); }345 346 virtual StatementNode * add_label( const std::string * name ) {347 stmt->get_labels().emplace_back( * name );344 virtual StatementNode * clone() const final { assert( false ); return nullptr; } 345 Statement * build() const { return const_cast<StatementNode*>(this)->stmt.release(); } 346 347 virtual StatementNode * add_label( const std::string * name ) { 348 stmt->get_labels().emplace_back( * name ); 348 349 delete name; 349 350 return this; 350 351 } 351 352 352 virtual StatementNode * append_last_case( StatementNode * );353 virtual StatementNode * append_last_case( StatementNode * ); 353 354 354 355 virtual void print( std::ostream &os, int indent = 0 ) {} … … 358 359 }; // StatementNode 359 360 360 Statement * build_expr( ExpressionNode *ctl );361 Statement * build_expr( ExpressionNode * ctl ); 361 362 362 363 struct ForCtl { 363 ForCtl( ExpressionNode * expr, ExpressionNode *condition, ExpressionNode *change ) :364 ForCtl( ExpressionNode * expr, ExpressionNode * condition, ExpressionNode * change ) : 364 365 init( new StatementNode( build_expr( expr ) ) ), condition( condition ), change( change ) {} 365 ForCtl( DeclarationNode * decl, ExpressionNode *condition, ExpressionNode *change ) :366 ForCtl( DeclarationNode * decl, ExpressionNode * condition, ExpressionNode * change ) : 366 367 init( new StatementNode( decl ) ), condition( condition ), change( change ) {} 367 368 368 StatementNode * init;369 ExpressionNode * condition;370 ExpressionNode * change;369 StatementNode * init; 370 ExpressionNode * condition; 371 ExpressionNode * change; 371 372 }; 372 373 373 Statement * build_if( ExpressionNode *ctl, StatementNode *then_stmt, StatementNode *else_stmt );374 Statement * build_switch( ExpressionNode *ctl, StatementNode *stmt );375 Statement * build_case( ExpressionNode *ctl );376 Statement * build_default();377 Statement * build_while( ExpressionNode *ctl, StatementNode *stmt, bool kind = false );378 Statement * build_for( ForCtl *forctl, StatementNode *stmt );379 Statement * build_branch( BranchStmt::Type kind );380 Statement * build_branch( std::string *identifier, BranchStmt::Type kind );381 Statement * build_computedgoto( ExpressionNode *ctl );382 Statement * build_return( ExpressionNode *ctl );383 Statement * build_throw( ExpressionNode *ctl );384 Statement * build_try( StatementNode *try_stmt, StatementNode *catch_stmt, StatementNode *finally_stmt );385 Statement * build_catch( DeclarationNode *decl, StatementNode *stmt, bool catchAny = false );386 Statement * build_finally( StatementNode *stmt );387 Statement * build_compound( StatementNode *first );388 Statement * build_asmstmt( bool voltile, ConstantExpr *instruction, ExpressionNode *output = 0, ExpressionNode *input = 0, ExpressionNode *clobber = 0, LabelNode *gotolabels = 0 );374 Statement * build_if( ExpressionNode * ctl, StatementNode * then_stmt, StatementNode * else_stmt ); 375 Statement * build_switch( ExpressionNode * ctl, StatementNode * stmt ); 376 Statement * build_case( ExpressionNode * ctl ); 377 Statement * build_default(); 378 Statement * build_while( ExpressionNode * ctl, StatementNode * stmt, bool kind = false ); 379 Statement * build_for( ForCtl * forctl, StatementNode * stmt ); 380 Statement * build_branch( BranchStmt::Type kind ); 381 Statement * build_branch( std::string * identifier, BranchStmt::Type kind ); 382 Statement * build_computedgoto( ExpressionNode * ctl ); 383 Statement * build_return( ExpressionNode * ctl ); 384 Statement * build_throw( ExpressionNode * ctl ); 385 Statement * build_try( StatementNode * try_stmt, StatementNode * catch_stmt, StatementNode * finally_stmt ); 386 Statement * build_catch( DeclarationNode * decl, StatementNode * stmt, bool catchAny = false ); 387 Statement * build_finally( StatementNode * stmt ); 388 Statement * build_compound( StatementNode * first ); 389 Statement * build_asmstmt( bool voltile, ConstantExpr * instruction, ExpressionNode * output = 0, ExpressionNode * input = 0, ExpressionNode * clobber = 0, LabelNode * gotolabels = 0 ); 389 390 390 391 //############################################################################## 391 392 392 393 template< typename SynTreeType, typename NodeType > 393 void buildList( const NodeType * firstNode, std::list< SynTreeType * > &outputList ) {394 void buildList( const NodeType * firstNode, std::list< SynTreeType * > &outputList ) { 394 395 SemanticError errors; 395 396 std::back_insert_iterator< std::list< SynTreeType * > > out( outputList ); 396 const NodeType * cur = firstNode;397 const NodeType * cur = firstNode; 397 398 398 399 while ( cur ) { 399 400 try { 400 // SynTreeType * result = dynamic_cast< SynTreeType * >( maybeBuild< typename std::result_of< decltype(&NodeType::build)(NodeType)>::type >( cur ) );401 SynTreeType * result = dynamic_cast< SynTreeType * >( maybeBuild< typename std::pointer_traits< decltype(cur->build())>::element_type >( cur ) );401 // SynTreeType * result = dynamic_cast< SynTreeType * >( maybeBuild< typename std::result_of< decltype(&NodeType::build)(NodeType)>::type >( cur ) ); 402 SynTreeType * result = dynamic_cast< SynTreeType * >( maybeBuild< typename std::pointer_traits< decltype(cur->build())>::element_type >( cur ) ); 402 403 if ( result ) { 403 * out++ = result;404 * out++ = result; 404 405 } // if 405 406 } catch( SemanticError &e ) { … … 414 415 415 416 // in DeclarationNode.cc 416 void buildList( const DeclarationNode * firstNode, std::list< Declaration * > &outputList );417 void buildList( const DeclarationNode * firstNode, std::list< DeclarationWithType * > &outputList );418 void buildTypeList( const DeclarationNode * firstNode, std::list< Type * > &outputList );417 void buildList( const DeclarationNode * firstNode, std::list< Declaration * > &outputList ); 418 void buildList( const DeclarationNode * firstNode, std::list< DeclarationWithType * > &outputList ); 419 void buildTypeList( const DeclarationNode * firstNode, std::list< Type * > &outputList ); 419 420 420 421 template< typename SynTreeType, typename NodeType > 421 void buildMoveList( const NodeType * firstNode, std::list< SynTreeType * > &outputList ) {422 void buildMoveList( const NodeType * firstNode, std::list< SynTreeType * > &outputList ) { 422 423 buildList(firstNode, outputList); 423 424 delete firstNode; -
src/Parser/TypeData.h
rf006f01 rfd782b2 10 10 // Created On : Sat May 16 15:18:36 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Fri Sep 9 23:20:55201613 // Update Count : 11 712 // Last Modified On : Sat Sep 10 09:42:54 2016 13 // Update Count : 118 14 14 // 15 15 … … 89 89 typedef std::bitset< DeclarationNode::NoOfQualifier > Qualifiers; 90 90 Qualifiers qualifiers; 91 typedef std::bitset< DeclarationNode::NoStorageClass > StorageClasses; 92 StorageClasses storageclasses; 91 93 DeclarationNode * forall; 92 94 -
src/Parser/parser.cc
rf006f01 rfd782b2 5943 5943 /* Line 1806 of yacc.c */ 5944 5944 #line 831 "parser.yy" 5945 { (yyval.sn) = new StatementNode( build_while( (yyvsp[(5) - (7)].en), (yyvsp[(2) - (7)].sn) ) ); }5945 { (yyval.sn) = new StatementNode( build_while( (yyvsp[(5) - (7)].en), (yyvsp[(2) - (7)].sn), true ) ); } 5946 5946 break; 5947 5947 -
src/Parser/parser.yy
rf006f01 rfd782b2 829 829 { $$ = new StatementNode( build_while( $3, $5 ) ); } 830 830 | DO statement WHILE '(' comma_expression ')' ';' 831 { $$ = new StatementNode( build_while( $5, $2 ) ); }831 { $$ = new StatementNode( build_while( $5, $2, true ) ); } 832 832 | FOR '(' push for_control_expression ')' statement 833 833 { $$ = new StatementNode( build_for( $4, $6 ) ); } -
src/examples/gc_no_raii/bug-repro/field.c
rf006f01 rfd782b2 62 62 { 63 63 struct gc_object_header* object; 64 #if _DEBUG64 #ifndef NDEBUG 65 65 intptr_t lower_limit; 66 66 intptr_t upper_limit; … … 71 71 gc_pool_object_iterator* const this, 72 72 void* start_object 73 #if _DEBUG73 #ifndef NDEBUG 74 74 , intptr_t pool_start 75 75 , intptr_t pool_end -
src/examples/gc_no_raii/src/gcpointers.c
rf006f01 rfd782b2 14 14 gc_object_header* obj = gc_get_object_for_ref(gc_get_state(), (void*)this); 15 15 check(obj); 16 check( gc_obj_is_valide(obj));17 check(gc_is_managed(this) == gc_is_managed(obj->type_chain) || obj->type_chain == NULL);16 check(is_valid(obj)); 17 check(gc_is_managed(this) == gc_is_managed(obj->type_chain) || !obj->type_chain); 18 18 this->next = obj->type_chain; 19 19 obj->type_chain = this; 20 check( obj->is_valide());20 check(is_valid(obj)); 21 21 } 22 22 else … … 24 24 gc_object_header* obj = gc_get_object_ptr((void*)this->ptr); 25 25 check(obj); 26 check(gc_obj_is_valide(obj)); 27 check(gc_is_managed(this) == gc_is_managed(obj->root_chain) || obj->root_chain == NULL); 26 check(is_valid(obj)); 27 check(!obj->root_chain || this->ptr == obj->root_chain->ptr); 28 check(!obj->root_chain || gc_is_managed(this) == gc_is_managed(obj->root_chain)); 28 29 this->next = obj->root_chain; 29 30 obj->root_chain = this; 30 check( gc_obj_is_valide(obj));31 check(is_valid(obj)); 31 32 } 32 33 } … … 69 70 } 70 71 71 gcpointer_t * gcpointer_assign(gcpointer_t* this, gcpointer_t*rhs)72 gcpointer_t ?=?(gcpointer_t* this, gcpointer_t rhs) 72 73 { 73 if(this != rhs)74 {75 unregister_ptr(this);74 unregister_ptr(this); 75 this->ptr = rhs.ptr; 76 register_ptr(this); 76 77 77 this->ptr = rhs->ptr; 78 79 register_ptr(this); 80 } 81 82 return this; 78 return *this; 83 79 } 84 80 85 81 //Logical operators 86 bool gcpointer_equal( gcpointer_t* this,gcpointer_t* rhs)82 bool gcpointer_equal(const gcpointer_t* this, const gcpointer_t* rhs) 87 83 { 88 84 return this->ptr == rhs->ptr; 89 85 } 90 86 91 bool gcpointer_not_equal( gcpointer_t* this,gcpointer_t* rhs)87 bool gcpointer_not_equal(const gcpointer_t* this, const gcpointer_t* rhs) 92 88 { 93 89 return this->ptr != rhs->ptr; 94 90 } 95 91 96 bool gcpointer_null( gcpointer_t* this)92 bool gcpointer_null(const gcpointer_t* this) 97 93 { 98 94 return this->ptr == (intptr_t)NULL; 99 95 } 96 97 #ifndef NDEBUG 98 bool is_valid(const gcpointer_t* this) { 99 if(gcpointer_null(this)) return true; 100 101 gc_object_header* obj = gc_get_object_ptr((void*)this->ptr); 102 check(obj); 103 check(is_valid(obj)); 104 check(!obj->root_chain || this->ptr == obj->root_chain->ptr); 105 106 if( !gc_is_managed(this)) 107 { 108 check( !(this->next) || this->ptr == this->next->ptr ); 109 } 110 111 return true; 112 } 113 #endif 100 114 101 115 forall(otype T) void ?{}(gcpointer(T)* this) { … … 107 121 } 108 122 109 forall(otype T) void ?{}(gcpointer(T)* this, gcpointer(T) *other) {110 (&this->internal) { other ->internal };123 forall(otype T) void ?{}(gcpointer(T)* this, gcpointer(T) other) { 124 (&this->internal) { other.internal }; 111 125 } 112 126 … … 115 129 } 116 130 117 // forall(otype T) gcpointer(T) ?=?(gcpointer(T) this, gcpointer(T) rhs); 131 forall(otype T) gcpointer(T) ?=?(gcpointer(T)* this, gcpointer(T) rhs) { 132 this->internal = rhs.internal; 133 return *this; 134 } 118 135 // 119 136 // forall(otype T) T *?(gcpointer(T) this); … … 124 141 // 125 142 // //Logical operators 143 forall(otype T) int ?!=?(gcpointer(T) this, int zero) { 144 return this.internal.ptr != 0; 145 } 126 146 // forall(otype T) int ?!=?(gcpointer(T) this, gcpointer(T) rhs); 127 147 // forall(otype T) int ?==?(gcpointer(T) this, gcpointer(T) rhs); -
src/examples/gc_no_raii/src/gcpointers.h
rf006f01 rfd782b2 3 3 #include <stdbool.h> 4 4 #include <stdint.h> 5 6 forall(dtype T) 7 struct gcpointer; 5 8 6 9 struct gcpointer_t … … 14 17 void ?{}(gcpointer_t* this, gcpointer_t other); 15 18 void ^?{}(gcpointer_t* this); 16 gcpointer_t * ?=?(gcpointer_tthis, gcpointer_t rhs);19 gcpointer_t ?=?(gcpointer_t* this, gcpointer_t rhs); 17 20 18 21 //Logical operators 19 22 bool gcpointer_equal(gcpointer_t* this, gcpointer_t* rhs); 20 23 bool gcpointer_not_equal(gcpointer_t* this, gcpointer_t* rhs); 21 bool gcpointer_null( gcpointer_t* this);24 bool gcpointer_null(const gcpointer_t* this); 22 25 23 forall(otype T) 26 27 #ifndef NDEBUG 28 bool is_valid(const gcpointer_t* this); 29 #endif 30 31 forall(dtype T) 24 32 struct gcpointer 25 33 { … … 30 38 forall(otype T) void ?{}(gcpointer(T)* this); 31 39 forall(otype T) void ?{}(gcpointer(T)* this, void* address); 32 forall(otype T) void ?{}(gcpointer(T)* this, gcpointer(T) *other);40 forall(otype T) void ?{}(gcpointer(T)* this, gcpointer(T) other); 33 41 forall(otype T) void ^?{}(gcpointer(T)* this); 34 forall(otype T) gcpointer(T) ?=?(gcpointer(T) this, gcpointer(T) rhs);42 forall(otype T) gcpointer(T) ?=?(gcpointer(T)* this, gcpointer(T) rhs); 35 43 36 44 37 forall(otype T) T *?(gcpointer(T) this);45 // forall(otype T) T *?(gcpointer(T) this); 38 46 forall(otype T) T* get(gcpointer(T)* this); 39 47 40 48 //Logical operators 49 forall(otype T) int ?!=?(gcpointer(T) this, int zero); 41 50 forall(otype T) int ?!=?(gcpointer(T) this, gcpointer(T) rhs); 42 51 forall(otype T) int ?==?(gcpointer(T) this, gcpointer(T) rhs); -
src/examples/gc_no_raii/src/internal/card_table.h
rf006f01 rfd782b2 1 1 #pragma once 2 3 #include <stdlib>4 2 5 3 #include "globals.h" … … 9 7 { 10 8 size_t card = ( ((intptr_t)address) & CARDS_OFFSET_MASK ) >> CARDS_SIZE_EXP; 9 checkf(card < CARDS_COUNT, (const char*)"%lu %lu = (%lx & %lx) >> %lu\n", (size_t)CARDS_COUNT, (size_t)card, (size_t)address, (size_t)CARDS_OFFSET_MASK, (size_t)CARDS_SIZE_EXP); 11 10 check(card < CARDS_COUNT); 12 11 return card; … … 19 18 }; 20 19 21 static inline void ctor (card_table_t* const this)20 static inline void ctor_card(card_table_t* const this) 22 21 { 23 22 this->count = 0; 24 23 } 25 24 26 static inline void dtor (card_table_t* const this)25 static inline void dtor_card(card_table_t* const this) 27 26 { 28 27 … … 48 47 else 49 48 { 50 check(card == count);49 check(card == this->count); 51 50 this->count++; 52 51 this->cards_start[card] = object; -
src/examples/gc_no_raii/src/internal/collector.c
rf006f01 rfd782b2 25 25 gc_object_header* obj = gc_get_object_ptr((void*)target->ptr); 26 26 27 check( gc_is_valide(obj));27 check(is_valid(obj)); 28 28 29 29 gcpointer_t** prev_next_ptr = managed ? &obj->type_chain : &obj->root_chain; … … 38 38 void* gc_allocate(size_t target_size) 39 39 { 40 sout | "Allocating " | target_size | " bytes" | endl;40 // sout | "Allocating " | target_size | " bytes" | endl; 41 41 42 42 size_t size = gc_compute_size(target_size + sizeof(gc_object_header)); 43 43 44 sout | "Object header size: " | sizeof(gc_object_header) | " bytes" | endl;45 sout | "Actual allocation size: " | size | " bytes" | endl;44 // sout | "Object header size: " | sizeof(gc_object_header) | " bytes" | endl; 45 // sout | "Actual allocation size: " | size | " bytes" | endl; 46 46 47 47 check(size < POOL_SIZE_BYTES); … … 60 60 if((intptr_t)(block = gc_try_allocate(gc, size))) return gc_finish_alloc_block(block, size, target_size); 61 61 62 checkf( false, "ERROR: allocation in new pool failed");62 checkf( (int) 0, "ERROR: allocation in new pool failed"); 63 63 64 64 return NULL; … … 67 67 void* gc_finish_alloc_block(void* block, size_t actual_size, size_t target_size) 68 68 { 69 void* data = (void*)(((intptr_t)block) + sizeof(gc_object_header));69 intptr_t data = ((intptr_t)block) + sizeof(gc_object_header); 70 70 void* header = block; 71 71 72 check( ((intptr_t)data)> ((intptr_t)block));73 check( ((intptr_t)data)>= ((intptr_t)header));74 check( is_aligned(data));75 check( ((intptr_t)data) + target_size <= ((intptr_t)block) + actual_size);72 check( data > ((intptr_t)block)); 73 check( data >= ((intptr_t)header)); 74 check( gc_is_aligned( (void*)data ) ); 75 check( data + target_size <= ((intptr_t)block) + actual_size ); 76 76 77 77 gc_object_header* obj = placement_ctor(header, actual_size); 78 78 79 79 (void)obj; //remove unsused warning since this is for debug 80 check(obj == g et_object_ptr(data));80 check(obj == gc_get_object_ptr( (void*)data )); 81 81 82 82 gc_register_allocation(gc_get_state(), actual_size); 83 83 84 return data;84 return (void*)data; 85 85 } 86 86 … … 119 119 check(!ptr->forward); 120 120 check(!ptr->is_forwarded); 121 check(gc_ is_from_space(gc_pool_of(ptr)));121 check(gc_pool_is_from_space(gc_pool_of(ptr))); 122 122 123 123 gc_memory_pool* pool = gc_pool_of(ptr)->mirror; … … 143 143 check(((intptr_t)field) < ((intptr_t)((intptr_t)object) + object->size)); 144 144 145 check(gc_is_in_to_space(gc_get_state(), & type->ptr));145 check(gc_is_in_to_space(gc_get_state(), &field->ptr)); 146 146 147 147 intptr_t* ref = &field->ptr; -
src/examples/gc_no_raii/src/internal/collector.h
rf006f01 rfd782b2 1 1 #pragma once 2 2 3 #include <stdlib >3 #include <stdlib.h> 4 4 5 5 #include "tools.h" -
src/examples/gc_no_raii/src/internal/memory_pool.c
rf006f01 rfd782b2 1 1 #include "memory_pool.h" 2 2 3 #include <stdlib> 3 extern "C" { 4 #include <stdlib.h> 5 #include <string.h> 6 } 4 7 8 #include "collector.h" 5 9 #include "object_header.h" 6 10 … … 15 19 card_table_t* new = (card_table_t*)malloc(sizeof(card_table_t)); 16 20 this->cards = new; 17 ctor (this->cards);21 ctor_card(this->cards); 18 22 19 23 this->end_p = ((uint8_t*)this) + size; 20 24 this->free_p = this->start_p; 21 25 22 check( gc_pool_of(this) == this);26 check( gc_pool_of( (void*)this ) == this); 23 27 check(this->cards); 24 28 gc_reset_pool(this); … … 27 31 void dtor(gc_memory_pool *const this) 28 32 { 29 dtor (this->cards);33 dtor_card(this->cards); 30 34 free(this->cards); 31 35 } … … 34 38 { 35 39 this->free_p = this->start_p; 36 #if _DEBUG37 memset(this->start_p, 0xCD, gc_pool_ total_size(this));40 #ifndef NDEBUG 41 memset(this->start_p, 0xCD, gc_pool_size_total(this)); 38 42 #endif 39 43 … … 41 45 reset(this->cards); 42 46 43 check(gc_pool_size_left(this) == gc_pool_ total_size(this));47 check(gc_pool_size_left(this) == gc_pool_size_total(this)); 44 48 } 45 49 … … 58 62 } 59 63 60 void ctor( 61 gc_pool_object_iterator* const this, 64 void ?{}( gc_pool_object_iterator* this, 62 65 struct gc_object_header* start_object 63 #if _DEBUG66 #ifndef NDEBUG 64 67 , intptr_t pool_start 65 68 , intptr_t pool_end … … 68 71 { 69 72 this->object = start_object; 70 #if _DEBUG73 #ifndef NDEBUG 71 74 this->lower_limit = pool_start; 72 75 this->upper_limit = pool_end; 73 76 #endif 74 77 75 check( ((intptr_t)start_object) >= lower_limit );76 check( ((intptr_t)start_object) <= upper_limit );78 check( ((intptr_t)start_object) >= this->lower_limit ); 79 check( ((intptr_t)start_object) <= this->upper_limit ); 77 80 } 81 82 void ^?{}( gc_pool_object_iterator* this ) {} 78 83 79 84 gc_pool_object_iterator gc_pool_iterator_for(gc_memory_pool* const this, void* member) … … 81 86 size_t card = card_of(member); 82 87 intptr_t member_add = (intptr_t)member; 83 void* start_obj; 84 intptr_t start_obj_add; 88 intptr_t start_obj; 85 89 86 90 do 87 91 { 88 92 check(card < CARDS_COUNT); 89 start_obj = object_at(this->cards, card);93 start_obj = (intptr_t)object_at(this->cards, card); 90 94 check(card != 0 || start_obj); 91 95 card--; 92 start_obj_add = (intptr_t)start_obj;93 96 } 94 while(start_obj _add > member_add || start_obj_add != 0);97 while(start_obj > member_add || !(start_obj)); 95 98 96 check( start_obj);97 99 check( start_obj ); 100 98 101 struct gc_object_header* start_obj_typed = (struct gc_object_header*)start_obj; 99 102 100 gc_pool_object_iterator it; 101 ctor( &it, 102 start_obj_typed, 103 #if _DEBUG 103 return (gc_pool_object_iterator) { 104 start_obj_typed 105 #ifndef NDEBUG 104 106 , (intptr_t)this->start_p 105 107 , (intptr_t)this->free_p 106 108 #endif 107 ); 108 return it; 109 }; 109 110 } 110 111 … … 117 118 { 118 119 struct gc_object_header* start_obj = (struct gc_object_header*)this->start_p; 119 gc_pool_object_iterator it; 120 ctor( &it, 121 start_obj, 122 #if _DEBUG 120 return (gc_pool_object_iterator) { 121 start_obj 122 #ifndef NDEBUG 123 123 , (intptr_t)this->start_p 124 124 , (intptr_t)this->free_p 125 125 #endif 126 ); 127 return it; 126 }; 128 127 } 129 128 130 129 gc_pool_object_iterator end(gc_memory_pool* const this) 131 130 { 132 gc_pool_object_iterator it; 133 ctor( &it, 134 (struct gc_object_header*)this->free_p, 135 #if _DEBUG 131 return (gc_pool_object_iterator) { 132 (struct gc_object_header*)this->free_p 133 #ifndef NDEBUG 136 134 , (intptr_t)this->start_p 137 135 , (intptr_t)this->free_p 138 136 #endif 139 ); 140 return it; 137 }; 141 138 } 142 139 … … 145 142 struct gc_object_header* object = it->object; 146 143 intptr_t next_ptr = ((intptr_t)object) + object->size; 147 check(next_ptr > lower_limit);148 check(next_ptr <= upper_limit);144 check(next_ptr > it->lower_limit); 145 check(next_ptr <= it->upper_limit); 149 146 150 147 struct gc_object_header* next_obj = ((struct gc_object_header*)next_ptr); 151 check(next_ptr == upper_limit || is_valide(next_obj));148 check(next_ptr == it->upper_limit || is_valid(next_obj)); 152 149 153 150 it->object = next_obj; -
src/examples/gc_no_raii/src/internal/memory_pool.h
rf006f01 rfd782b2 39 39 { 40 40 struct gc_object_header* object; 41 #if _DEBUG41 #ifndef NDEBUG 42 42 intptr_t lower_limit; 43 43 intptr_t upper_limit; … … 46 46 47 47 48 void ctor( 49 gc_pool_object_iterator* const this, 48 void ?{}( gc_pool_object_iterator* this, 50 49 struct gc_object_header* start_object 51 #if _DEBUG50 #ifndef NDEBUG 52 51 , intptr_t pool_start 53 52 , intptr_t pool_end 54 53 #endif 55 54 ); 55 56 void ^?{}( gc_pool_object_iterator* this ); 56 57 57 58 bool ?!=?(const gc_pool_object_iterator lhs, const gc_pool_object_iterator rhs); -
src/examples/gc_no_raii/src/internal/object_header.c
rf006f01 rfd782b2 3 3 #include <stdint.h> 4 4 5 #include "collector.h" 5 6 #include "globals.h" 6 7 #include "gcpointers.h" … … 8 9 void ctor(gc_object_header* const this, size_t inSize) 9 10 { 10 #if _DEBUG11 #ifndef NDEBUG 11 12 this->canary_start = CANARY_VALUE; 12 13 #endif … … 18 19 this->is_forwarded = false; 19 20 20 #if _DEBUG21 #ifndef NDEBUG 21 22 this->canary_end = CANARY_VALUE; 22 23 #endif … … 25 26 void copy_ctor(gc_object_header* const this, const gc_object_header* const other) 26 27 { 27 #if _DEBUG28 #ifndef NDEBUG 28 29 this->canary_start = CANARY_VALUE; 29 30 #endif … … 35 36 this->is_forwarded = false; 36 37 37 #if _DEBUG38 #ifndef NDEBUG 38 39 this->canary_end = CANARY_VALUE; 39 40 #endif … … 42 43 while(root) 43 44 { 44 check(g et_object_ptr(root->ptr) == other);45 check(gc_get_object_ptr( (void*)root->ptr ) == other); 45 46 root->ptr = ((intptr_t)this) + sizeof(gc_object_header); 46 47 47 check(g et_object_ptr(root->ptr) == this);48 check(gc_get_object_ptr( (void*)root->ptr ) == this); 48 49 root = root->next; 49 50 } … … 56 57 57 58 size_t offset = (intptr_t)type - (intptr_t)other; 58 check(offset < size);59 check(offset < this->size); 59 60 60 61 gcpointer_t* member_ptr = (gcpointer_t*)( (intptr_t)this + offset ); … … 63 64 64 65 size_t next_offset = type->next ? (intptr_t)type->next - (intptr_t)other : 0; 65 check(next_offset < size);66 check(next_offset < this->size); 66 67 67 68 gcpointer_t* next_ptr = type->next ? (gcpointer_t*)((intptr_t)this + next_offset) : NULL; … … 73 74 } 74 75 75 check(is_valid e(this));76 check(is_valid(this)); 76 77 } 77 78 78 #if _DEBUG79 bool is_valid e(const gc_object_header* const this)79 #ifndef NDEBUG 80 bool is_valid(const gc_object_header* const this) 80 81 { 81 check( this->canary_start ==CANARY_VALUE);82 check( this->canary_end ==CANARY_VALUE);82 check((intptr_t)this->canary_start == (intptr_t)CANARY_VALUE); 83 check((intptr_t)this->canary_end == (intptr_t)CANARY_VALUE); 83 84 84 check(this->is_forwarded == ( this->forward != nullptr));85 check(this->is_forwarded == ( (intptr_t)this->forward != (intptr_t)NULL)); 85 86 86 87 check(this->size < POOL_SIZE_BYTES); … … 89 90 while(root) 90 91 { 91 check (get_object_ptr(root->ptr) ==this);92 checkf(gc_get_object_ptr( (void*)root->ptr ) == this, (const char*)"Expected %lX got %lX\n", gc_get_object_ptr( (void*)root->ptr ), this); 92 93 93 94 root = root->next; 94 95 } 95 96 96 gcpointer_t* type = t ype_chain;97 gcpointer_t* type = this->type_chain; 97 98 while(type) 98 99 { 99 100 check((intptr_t)type > (intptr_t)this); 100 check((intptr_t)type < (intptr_t)(( intptr_t)this +size));101 check((intptr_t)type < (intptr_t)(((intptr_t)this) + this->size)); 101 102 102 103 type = type->next; … … 105 106 return true; 106 107 } 108 #else 109 #error blarg 107 110 #endif -
src/examples/gc_no_raii/src/internal/object_header.h
rf006f01 rfd782b2 7 7 #include "tools.h" 8 8 9 #if 10 static const long unsigned int CANARY_VALUE =0xCAFEBABACAFEBABA;9 #ifndef NDEBUG 10 static void* const CANARY_VALUE = (void*)0xCAFEBABACAFEBABA; 11 11 #endif 12 12 … … 16 16 struct gc_object_header 17 17 { 18 #if 18 #ifndef NDEBUG 19 19 void* canary_start; 20 20 #endif … … 26 26 bool is_forwarded; 27 27 28 #if 28 #ifndef NDEBUG 29 29 void* canary_end; 30 30 #endif … … 47 47 return this; 48 48 } 49 50 #ifndef NDEBUG 51 bool is_valid(const gc_object_header* const this); 52 #endif -
src/examples/gc_no_raii/src/internal/state.c
rf006f01 rfd782b2 21 21 void gc_state_calc_usage(gc_state *const this); 22 22 23 #if 23 #ifndef NDEBUG 24 24 bool gc_state_roots_match(gc_state *const this); 25 25 bool gc_state_no_from_space_ref(gc_state *const this); … … 76 76 gc_object_header* gc_get_object_for_ref(gc_state* state, void* member) 77 77 { 78 volatile int stage = 0; 78 79 intptr_t target = ((intptr_t)member); 79 80 if(!gc_is_in_heap(state, member)) return NULL; 81 stage++; 80 82 81 83 gc_memory_pool* pool = gc_pool_of(member); 84 stage++; 82 85 gc_pool_object_iterator it = gc_pool_iterator_for(pool, member); 86 stage++; 83 87 gc_pool_object_iterator end = end(pool); 88 stage++; 84 89 85 90 while(it != end) 86 91 { 87 92 gc_object_header* object = *it; 93 check(object); 94 check( is_valid(object) ); 88 95 { 89 96 intptr_t start = ((intptr_t)object); … … 94 101 } 95 102 } 103 stage++; 96 104 ++it; 97 105 } 98 106 99 checkf( false, "is_in_heap() and iterator_for() return inconsistent data");107 checkf( (int) 0, "is_in_heap() and iterator_for() return inconsistent data"); 100 108 abort(); 101 109 return NULL; … … 176 184 this->from_code = (~this->from_code) & 0x01; 177 185 178 #if _DEBUG186 #ifndef NDEBUG 179 187 { 180 188 gc_memory_pool* pool = this->from_space; … … 251 259 } 252 260 253 #if _DEBUG261 #ifndef NDEBUG 254 262 bool gc_state_roots_match(gc_state* const this) 255 263 { … … 265 273 size += object->size; 266 274 267 gcpointer_ base* ptr = object->root_chain;275 gcpointer_t* ptr = object->root_chain; 268 276 while(ptr) 269 277 { 270 check(g et_object_ptr(ptr->m_ptr) == object);271 ptr = ptr-> m_next;278 check(gc_get_object_ptr( (void*)ptr->ptr ) == object); 279 ptr = ptr->next; 272 280 } 273 281 } 274 282 275 check(size + gc_pool_size_used(pool) == gc_pool_size_total(pool)); 283 checkf(size + gc_pool_size_left(pool) == gc_pool_size_total(pool), 284 (const char*)"expected %lu + %lu == %lu\n", 285 (size_t)size, 286 (size_t)gc_pool_size_left(pool), 287 (size_t)gc_pool_size_total(pool)); 276 288 277 289 pool = pool->next; … … 286 298 while(pool) 287 299 { 288 void** potential_ref = (void**)pool-> m_start;289 while(potential_ref < (void**)pool-> m_free)300 void** potential_ref = (void**)pool->start_p; 301 while(potential_ref < (void**)pool->free_p) 290 302 { 291 303 check(!gc_is_in_heap(this, *potential_ref)); -
src/examples/gc_no_raii/src/internal/state.h
rf006f01 rfd782b2 38 38 static inline bool gc_needs_collect(gc_state* state) 39 39 { 40 sout | "Used Space: " | state->used_space | " bytes" | endl;40 // sout | "Used Space: " | state->used_space | " bytes" | endl; 41 41 return state->used_space * 2 > state->total_space; 42 42 } -
src/examples/gc_no_raii/src/tools/checks.h
rf006f01 rfd782b2 1 1 #pragma once 2 2 3 #if _DEBUG 3 #ifdef NDEBUG 4 5 #define check(x) 6 7 #define checkf(x, format, ...) 8 9 #warning no debug checks 10 11 #else 4 12 5 13 #include <stdlib.h> … … 10 18 printf("CHECK failed : %s at %s:%i\n", #x, __FILE__, __LINE__);\ 11 19 abort();\ 12 }}while( 0)\20 }}while( (int)0 )\ 13 21 14 22 #define checkf(x, ...) do {\ … … 17 25 printf(__VA_ARGS__);\ 18 26 abort();\ 19 }}while(0)\ 20 21 #else 22 23 #define check(x) 24 25 #define checkf(x, format, ...) 27 }}while( (int)0 )\ 26 28 27 29 #endif //NO_CHECKS -
src/examples/gc_no_raii/src/tools/print.c
rf006f01 rfd782b2 1 1 #include "tools.h" 2 2 3 #if _DEBUG4 ofstream *sout = ofstream_stdout();3 #ifndef NDEBUG 4 // ofstream *sout = ofstream_stdout(); 5 5 #endif -
src/examples/gc_no_raii/src/tools/print.h
rf006f01 rfd782b2 1 1 #pragma once 2 2 3 #if _DEBUG4 5 #include <fstream>6 7 #define DEBUG_OUT(x) sout | x | endl;8 9 #else3 // #ifndef NDEBUG 4 // 5 // #include <fstream> 6 // 7 // #define DEBUG_OUT(x) sout | x | endl; 8 // 9 // #else 10 10 11 11 #define DEBUG_OUT(x) 12 12 13 #endif //NO_CHECKS13 // #endif //NO_CHECKS -
src/examples/gc_no_raii/test/badlll.c
rf006f01 rfd782b2 1 1 #include "gc.h" 2 3 #include <stdio.h> 2 4 3 5 struct List_t … … 7 9 }; 8 10 9 void ?{}(List_t* this);10 List_t* ?=?(List_t* this, List_t* rhs);11 12 11 typedef gcpointer(List_t) LLL; 13 12 14 #define MAX (1024 * 1 024)13 #define MAX (1024 * 1) 15 14 16 // LLL buildLLL(int sz) 17 void bla() 15 LLL buildLLL(int sz) 18 16 { 19 int i; 20 // LLL ll0;//, lll, llc; 21 // 22 // ll0 = gcmalloc(); 23 // ll0->val = 0; 24 // lll = ll0; 25 // 26 // for (i = 1; i < sz; i++) 27 // { 28 // llc = gcmalloc(); 29 // llc->val = i; 30 // lll->next = llc; 31 // lll = llc; 32 // } 33 // 34 // return ll0; 17 int i = 0; 18 LLL ll0; 19 20 gcmalloc( &ll0 ); 21 List_t* ll0_ptr = get( &ll0 ); 22 ll0_ptr->val = i; 23 LLL lll = ll0; 24 25 for (i = 1; i < sz; i++) 26 { 27 LLL llc; 28 gcmalloc( &llc ); 29 List_t* llc_ptr = get( &llc ); 30 llc_ptr->val = i; 31 List_t* lll_ptr = get( &lll ); 32 lll_ptr->next = llc; 33 34 lll = llc; 35 } 36 37 check(is_valid( &ll0.internal )); 38 39 return ll0; 35 40 } 36 // 37 // void testLLL(LLL lll) 38 // { 39 // unsigned char *counted; 40 // 41 // counted = (unsigned char *) calloc(MAX, sizeof(unsigned char)); 42 // while (lll) 43 // { 44 // counted[lll->val]++; 45 // if (counted[lll->val] > 1) 46 // { 47 // fprintf(stderr, "ERROR! Encountered %d twice!\n", lll->val); 48 // exit(1); 49 // } 50 // lll = lll->next; 51 // } 52 // 53 // return; 54 // } 41 42 void testLLL(LLL lll) 43 { 44 unsigned char *counted; 45 46 counted = (unsigned char *) calloc(MAX, sizeof(unsigned char)); 47 while (lll) 48 { 49 List_t* lll_ptr = get( &lll ); 50 counted[lll_ptr->val]++; 51 if (counted[lll_ptr->val] > 1) 52 { 53 fprintf(stderr, "ERROR! Encountered %d twice!\n", lll_ptr->val); 54 exit(1); 55 } 56 lll = lll_ptr->next; 57 } 58 59 return; 60 } 55 61 56 62 int main(void) … … 58 64 LLL mylll; 59 65 60 //mylll = buildLLL(MAX);61 // 62 //testLLL(mylll);66 mylll = buildLLL(MAX); 67 68 testLLL(mylll); 63 69 64 70 return 0; -
src/tests/.expect/declarationErrors.txt
rf006f01 rfd782b2 2 2 Error: duplicate static in declaration of x1: static const volatile short int 3 3 4 Error: multipleextern & static in declaration of x2: extern const volatile short int4 Error: conflicting extern & static in declaration of x2: extern const volatile short int 5 5 6 Error: multiple extern & auto, multiple extern & static, multipleextern & static, duplicate extern in declaration of x3: extern const volatile short int6 Error: conflicting extern & auto, conflicting extern & static, conflicting extern & static, duplicate extern in declaration of x3: extern const volatile short int 7 7 8 8 Error: duplicate static in declaration of x4: static const volatile instance of const volatile struct __anonymous0 -
src/tests/avltree/avl_test.c
rf006f01 rfd782b2 14 14 15 15 // int -> int 16 tree(int, int) * imap = create(-1, 0);16 tree(int, int) * imap = create(-1, (int)0); 17 17 insert(&imap, 12, 13); 18 18 insert(&imap, 2, 3);
Note: See TracChangeset
for help on using the changeset viewer.