diff options
author | Adrian Thurston <thurston@complang.org> | 2014-12-14 12:42:51 -0500 |
---|---|---|
committer | Adrian Thurston <thurston@complang.org> | 2014-12-14 12:44:05 -0500 |
commit | dff64d84c61d135f5929ec4fd3344607f209f366 (patch) | |
tree | 17bad6b1973d245841ba071e15ca4fcad0e48c72 | |
parent | 004cbe9e9c92932e62076f22a42f75e5332864af (diff) | |
download | colm-dff64d84c61d135f5929ec4fd3344607f209f366.tar.gz |
removed useOffset from Field, removed Argv field type
The useOffset bool can be computed from the type. The argv field doesn't need
to exist. Using the user field type instead.
-rw-r--r-- | src/declare.cc | 34 | ||||
-rw-r--r-- | src/exports.cc | 4 | ||||
-rw-r--r-- | src/parsetree.h | 11 | ||||
-rw-r--r-- | src/synthesis.cc | 16 |
4 files changed, 22 insertions, 43 deletions
diff --git a/src/declare.cc b/src/declare.cc index 5ac1da8b..df223ca8 100644 --- a/src/declare.cc +++ b/src/declare.cc @@ -676,7 +676,6 @@ void Compiler::addMatchLength( ObjectDef *frame, LangEl *lel ) ObjectField *el = ObjectField::cons( InputLoc(), ObjectField::InbuiltFieldType, typeRef, "match_length" ); el->isConst = true; - el->useOffset = false; el->inGetR = IN_GET_MATCH_LENGTH_R; frame->rootScope->insertField( el->name, el ); } @@ -690,7 +689,6 @@ void Compiler::addMatchText( ObjectDef *frame, LangEl *lel ) ObjectField *el = ObjectField::cons( internal, ObjectField::InbuiltFieldType, typeRef, "match_text" ); el->isConst = true; - el->useOffset = false; el->inGetR = IN_GET_MATCH_TEXT_R; frame->rootScope->insertField( el->name, el ); } @@ -705,7 +703,6 @@ void Compiler::addInput( ObjectDef *frame ) ObjectField *el = ObjectField::cons( internal, ObjectField::InbuiltFieldType, typeRef, "input" ); el->isConst = false; - el->useOffset = false; el->isCustom = true; el->inGetR = IN_LOAD_INPUT_R; el->inGetWV = IN_LOAD_INPUT_WV; @@ -722,7 +719,6 @@ void Compiler::addCtx( ObjectDef *frame ) ObjectField *el = ObjectField::cons( internal, ObjectField::InbuiltFieldType, typeRef, "ctx" ); el->isConst = false; - el->useOffset = false; el->isCustom = true; el->inGetR = IN_LOAD_CTX_R; el->inGetWV = IN_LOAD_CTX_WV; @@ -779,7 +775,6 @@ ObjectField *Compiler::makeDataEl() ObjectField *el = ObjectField::cons( internal, ObjectField::InbuiltFieldType, typeRef, "data" ); - el->useOffset = false; el->inGetR = IN_GET_TOKEN_DATA_R; el->inSetWC = IN_SET_TOKEN_DATA_WC; el->inSetWV = IN_SET_TOKEN_DATA_WV; @@ -794,7 +789,6 @@ ObjectField *Compiler::makePosEl() ObjectField::InbuiltFieldType, typeRef, "pos" ); el->isConst = true; - el->useOffset = false; el->inGetR = IN_GET_TOKEN_POS_R; return el; } @@ -807,7 +801,6 @@ ObjectField *Compiler::makeLineEl() ObjectField::InbuiltFieldType, typeRef, "line" ); el->isConst = true; - el->useOffset = false; el->inGetR = IN_GET_TOKEN_LINE_R; return el; } @@ -821,7 +814,6 @@ void Compiler::addLengthField( ObjectDef *objDef, Code getLength ) ObjectField *el = ObjectField::cons( internal, ObjectField::InbuiltFieldType, typeRef, "length" ); el->isConst = true; - el->useOffset = false; el->inGetR = getLength; objDef->rootScope->insertField( el->name, el ); @@ -890,7 +882,6 @@ void Compiler::addStdin() ObjectField *el = ObjectField::cons( internal, ObjectField::InbuiltFieldType, typeRef, "stdin" ); el->isConst = true; - el->useOffset = false; el->inGetR = IN_GET_STDIN; el->inGetWC = IN_GET_STDIN; el->inGetWV = IN_GET_STDIN; @@ -907,7 +898,6 @@ void Compiler::addStdout() ObjectField *el = ObjectField::cons( internal, ObjectField::InbuiltFieldType, typeRef, "stdout" ); el->isConst = true; - el->useOffset = false; el->inGetR = IN_GET_STDOUT; el->inGetWC = IN_GET_STDOUT; el->inGetWV = IN_GET_STDOUT; @@ -924,7 +914,6 @@ void Compiler::addStderr() ObjectField *el = ObjectField::cons( internal, ObjectField::InbuiltFieldType, typeRef, "stderr" ); el->isConst = true; - el->useOffset = false; el->inGetR = IN_GET_STDERR; el->inGetWC = IN_GET_STDERR; el->inGetWV = IN_GET_STDERR; @@ -935,13 +924,13 @@ void Compiler::addArgv() { /* Create the field and insert it into the map. */ ObjectField *el = ObjectField::cons( internal, - ObjectField::ArgvType, argvTypeRef, "argv" ); + ObjectField::UserFieldType, argvTypeRef, "argv" ); el->isConst = true; globalObjectDef->rootScope->insertField( el->name, el ); argvList = el; el = ObjectField::cons( internal, - ObjectField::ArgvType, argvTypeRef, "argv0" ); + ObjectField::UserFieldType, argvTypeRef, "argv0" ); el->isConst = true; globalObjectDef->rootScope->insertField( el->name, el ); argv0 = el; @@ -956,7 +945,6 @@ void Compiler::addError() ObjectField *el = ObjectField::cons( internal, ObjectField::InbuiltFieldType, typeRef, "error" ); el->isConst = true; - el->useOffset = false; el->inGetR = IN_GET_ERROR; el->inGetWC = IN_GET_ERROR; el->inGetWV = IN_GET_ERROR; @@ -1028,7 +1016,7 @@ void Compiler::initList2Field( GenericType *gen, const char *name, int offset ) /* Make the type ref and create the field. */ TypeRef *typeRef = TypeRef::cons( internal, gen->utArg ); ObjectField *el = ObjectField::cons( internal, - ObjectField::InbuiltFieldType, typeRef, name ); + ObjectField::InbuiltOffType, typeRef, name ); el->inGetR = IN_GET_LIST2_MEM_R; // el->inGetWC = IN_GET_LIST2_MEM_WC; @@ -1038,8 +1026,6 @@ void Compiler::initList2Field( GenericType *gen, const char *name, int offset ) gen->objDef->rootScope->insertField( el->name, el ); - el->useOffset = true; - /* Zero for head, One for tail. */ el->offset = offset; } @@ -1056,7 +1042,7 @@ void Compiler::initList2ElField( GenericType *gen, const char *name, int offset { /* Make the type ref and create the field. */ TypeRef *typeRef = TypeRef::cons( internal, gen->utArg ); - ObjectField *el = ObjectField::cons( internal, ObjectField::InbuiltFieldType, typeRef, name ); + ObjectField *el = ObjectField::cons( internal, ObjectField::InbuiltOffType, typeRef, name ); el->inGetR = IN_GET_LIST2EL_MEM_R; // el->inGetWC = IN_GET_LIST2EL_MEM_WC; @@ -1066,8 +1052,6 @@ void Compiler::initList2ElField( GenericType *gen, const char *name, int offset gen->objDef->rootScope->insertField( el->name, el ); - el->useOffset = true; - /* Zero for head, One for tail. */ el->offset = offset; } @@ -1097,7 +1081,7 @@ void Compiler::initListField( GenericType *gen, const char *name, int offset ) /* Make the type ref and create the field. */ TypeRef *typeRef = TypeRef::cons( internal, gen->utArg ); ObjectField *el = ObjectField::cons( internal, - ObjectField::InbuiltFieldType, typeRef, name ); + ObjectField::InbuiltOffType, typeRef, name ); el->inGetR = IN_GET_LIST_MEM_R; el->inGetWC = IN_GET_LIST_MEM_WC; @@ -1107,8 +1091,6 @@ void Compiler::initListField( GenericType *gen, const char *name, int offset ) gen->objDef->rootScope->insertField( el->name, el ); - el->useOffset = true; - /* Zero for head, One for tail. */ el->offset = offset; } @@ -1134,7 +1116,7 @@ void Compiler::initParserField( GenericType *gen, const char *name, { /* Make the type ref and create the field. */ ObjectField *el = ObjectField::cons( internal, - ObjectField::InbuiltFieldType, typeRef, name ); + ObjectField::InbuiltOffType, typeRef, name ); el->inGetR = IN_GET_PARSER_MEM_R; el->inGetWC = IN_GET_PARSER_MEM_WC; @@ -1144,8 +1126,6 @@ void Compiler::initParserField( GenericType *gen, const char *name, gen->objDef->rootScope->insertField( el->name, el ); - el->useOffset = true; - /* Zero for head, One for tail. */ el->offset = offset; } @@ -1168,8 +1148,6 @@ void Compiler::initCtxField( GenericType *gen ) el->inSetWV = IN_SET_PARSER_CTX_WV; gen->objDef->rootScope->insertField( el->name, el ); - - el->useOffset = false; } void Compiler::initParserFields( GenericType *gen ) diff --git a/src/exports.cc b/src/exports.cc index a50746d9..045722e9 100644 --- a/src/exports.cc +++ b/src/exports.cc @@ -105,7 +105,7 @@ void Compiler::generateExports() ObjFieldList *objFieldList = lel->objectDef->objFieldList; for ( ObjFieldList::Iter ofi = *objFieldList; ofi.lte(); ofi++ ) { ObjectField *field = ofi->value; - if ( ( field->useOffset && field->typeRef != 0 ) || field->isRhsGet() ) { + if ( ( field->useOffset() && field->typeRef != 0 ) || field->isRhsGet() ) { UniqueType *ut = field->typeRef->resolveType( this ); if ( ut != 0 && ut->typeId == TYPE_TREE ) @@ -193,7 +193,7 @@ void Compiler::generateExportsImpl() ObjFieldList *objFieldList = lel->objectDef->objFieldList; for ( ObjFieldList::Iter ofi = *objFieldList; ofi.lte(); ofi++ ) { ObjectField *field = ofi->value; - if ( field->useOffset && field->typeRef != 0 ) { + if ( field->useOffset() && field->typeRef != 0 ) { UniqueType *ut = field->typeRef->resolveType( this ); if ( ut != 0 && ut->typeId == TYPE_TREE ) { diff --git a/src/parsetree.h b/src/parsetree.h index 90a93b38..5a565fc6 100644 --- a/src/parsetree.h +++ b/src/parsetree.h @@ -2349,11 +2349,11 @@ struct ObjectField LhsElType, RedRhsType, InbuiltFieldType, + InbuiltOffType, RhsNameType, - LexSubstrType, - ArgvType, ParamValType, - ParamRefType + ParamRefType, + LexSubstrType }; ObjectField() @@ -2363,7 +2363,6 @@ struct ObjectField scope(0), offset(0), beenReferenced(false), - useOffset(true), isConst(false), refActive(false), isCustom(false), @@ -2398,6 +2397,9 @@ struct ObjectField bool isRhsGet() { return type == RhsNameType; } + + bool useOffset() + { return type != RhsNameType && type != InbuiltFieldType; } InputLoc loc; Type type; @@ -2407,7 +2409,6 @@ struct ObjectField ObjNameScope *scope; long offset; bool beenReferenced; - bool useOffset; bool isConst; bool refActive; bool isCustom; diff --git a/src/synthesis.cc b/src/synthesis.cc index 386afb60..5aa32279 100644 --- a/src/synthesis.cc +++ b/src/synthesis.cc @@ -263,7 +263,7 @@ UniqueType *LangVarRef::loadField( Compiler *pd, CodeVect &code, code.append( el->inGetR ); } - if ( el->useOffset ) { + if ( el->useOffset() ) { /* Gets of locals and fields require offsets. Fake vars like token * data and lhs don't require it. */ code.appendHalf( el->offset ); @@ -551,7 +551,7 @@ void LangVarRef::setField( Compiler *pd, CodeVect &code, code.append( el->inSetWC ); /* Maybe write out an offset. */ - if ( el->useOffset ) + if ( el->useOffset() ) code.appendHalf( el->offset ); } @@ -2343,7 +2343,7 @@ void Compiler::findLocals( ObjectDef *localFrame, CodeBlock *block ) /* FIXME: This test needs to be improved. Match_text was getting * through before useOffset was tested. What will? */ - if ( el->useOffset && !el->isLhsEl() && + if ( el->useOffset() && !el->isLhsEl() && ( el->beenReferenced || el->isParam() ) ) { UniqueType *ut = el->typeRef->uniqueType; @@ -2353,7 +2353,7 @@ void Compiler::findLocals( ObjectDef *localFrame, CodeBlock *block ) } } - if ( el->useOffset ) { + if ( el->useOffset() ) { UniqueType *ut = el->typeRef->uniqueType; if ( ut->typeId == TYPE_ITER ) { int depth = el->scope->depth(); @@ -2620,7 +2620,6 @@ void ObjectField::initField() inSetWC = IN_SET_LOCAL_REF_WC; break; - case ArgvType: case UserFieldType: inGetR = IN_GET_FIELD_R; inGetWC = IN_GET_FIELD_WC; @@ -2630,7 +2629,6 @@ void ObjectField::initField() break; case RhsNameType: - useOffset = false; inGetR = IN_GET_RHS_VAL_R; inGetWC = IN_GET_RHS_VAL_WC; inGetWV = IN_GET_RHS_VAL_WV; @@ -2638,8 +2636,10 @@ void ObjectField::initField() inSetWV = IN_SET_RHS_VAL_WC; break; - /* Done outside the cons, at place of call. */ + /* Inbuilts have instructions intialized outside the cons, at place of + * call. */ case InbuiltFieldType: + case InbuiltOffType: break; /* Out of date impl. */ @@ -2664,7 +2664,6 @@ void ObjectDef::placeField( Compiler *pd, ObjectField *field ) break; case ObjectField::UserFieldType: - case ObjectField::ArgvType: /* Tree object frame fields. Record the position, then move the * running offset. */ @@ -2673,6 +2672,7 @@ void ObjectDef::placeField( Compiler *pd, ObjectField *field ) break; case ObjectField::InbuiltFieldType: + case ObjectField::InbuiltOffType: case ObjectField::RhsNameType: case ObjectField::LexSubstrType: |