summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdrian Thurston <thurston@complang.org>2014-12-14 12:42:51 -0500
committerAdrian Thurston <thurston@complang.org>2014-12-14 12:44:05 -0500
commitdff64d84c61d135f5929ec4fd3344607f209f366 (patch)
tree17bad6b1973d245841ba071e15ca4fcad0e48c72
parent004cbe9e9c92932e62076f22a42f75e5332864af (diff)
downloadcolm-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.cc34
-rw-r--r--src/exports.cc4
-rw-r--r--src/parsetree.h11
-rw-r--r--src/synthesis.cc16
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: