if(external.type == classExternal)
{
ClassDefinition _class = external._class;
- if(_class.definitions && !_class.symbol.registered)
+ if(_class.definitions && (!_class.symbol.registered || !inCompiler))
{
ProcessClass(normalClass, _class.definitions, _class.symbol, _class.baseSpecs, null, _class.loc, ast, external.prev, null, _class.declMode);
_class.symbol.isStatic = _class.declMode == staticAccess;
{
for(dir : sourceDirs)
{
+ char configDir[MAX_FILENAME];
strcpy(symFile, dir);
- PathCat(symFile, "Debug");
+ // PathCat(symFile, "Debug");
+ PathCat(symFile, "obj");
+ sprintf(configDir, "debug.%s", (GetRuntimePlatform() == win32) ? "win32" : "linux");
+ PathCat(symFile, configDir);
+
PathCat(symFile, name);
ChangeExtension(symFile, "sym", symFile);
if(FileExists(symFile))
{
int c;
int unionMemberOffset = 0;
+ int bitFields = 0;
if(!member && _class.destructionWatchOffset)
_class.memberOffset += sizeof(OldList);
else if(dataMember.type == normalMember && dataMember.dataType)
{
int size;
- int alignment;
+ int alignment = 0;
// Prevent infinite recursion
if(dataMember.dataType.kind != classType ||
_class.type != structClass)))
ComputeTypeSize(dataMember.dataType);
- size = dataMember.dataType.size;
- alignment = dataMember.dataType.alignment;
+ if(dataMember.dataType.bitFieldCount)
+ {
+ bitFields += dataMember.dataType.bitFieldCount;
+ size = 0;
+ }
+ else
+ {
+ if(bitFields)
+ {
+ int size = (bitFields + 7) / 8;
+
+ if(isMember)
+ {
+ // TESTING THIS PADDING CODE
+ if(alignment)
+ {
+ member.structAlignment = Max(member.structAlignment, alignment);
+
+ if(member.memberOffset % alignment)
+ member.memberOffset += alignment - (member.memberOffset % alignment);
+ }
+
+ dataMember.offset = member.memberOffset;
+ if(member.type == unionMember)
+ unionMemberOffset = Max(unionMemberOffset, dataMember.dataType.size);
+ else
+ {
+ member.memberOffset += size;
+ }
+ }
+ else
+ {
+ // TESTING THIS PADDING CODE
+ if(alignment)
+ {
+ _class.structAlignment = Max(_class.structAlignment, alignment);
+
+ if(_class.memberOffset % alignment)
+ _class.memberOffset += alignment - (_class.memberOffset % alignment);
+ }
+
+ dataMember.offset = _class.memberOffset;
+ _class.memberOffset += size;
+ }
+ bitFields = 0;
+ }
+ size = dataMember.dataType.size;
+ alignment = dataMember.dataType.alignment;
+ }
#ifdef _DEBUG
if(!size)
}
}
}
+ if(bitFields)
+ {
+ int alignment = 0;
+ int size = (bitFields + 7) / 8;
+
+ if(isMember)
+ {
+ // TESTING THIS PADDING CODE
+ if(alignment)
+ {
+ member.structAlignment = Max(member.structAlignment, alignment);
+
+ if(member.memberOffset % alignment)
+ member.memberOffset += alignment - (member.memberOffset % alignment);
+ }
+
+ if(member.type == unionMember)
+ unionMemberOffset = Max(unionMemberOffset, dataMember.dataType.size);
+ else
+ {
+ member.memberOffset += size;
+ }
+ }
+ else
+ {
+ // TESTING THIS PADDING CODE
+ if(alignment)
+ {
+ _class.structAlignment = Max(_class.structAlignment, alignment);
+
+ if(_class.memberOffset % alignment)
+ _class.memberOffset += alignment - (_class.memberOffset % alignment);
+ }
+ _class.memberOffset += size;
+ }
+ bitFields = 0;
+ }
}
if(member && member.type == unionMember)
{
sourceExp.expType = null;
ProcessExpressionType(sourceExp);
+ FreeType(sourceExp.expType);
+ sourceExp.expType = dest;
+
FreeType(source);
- FreeType(dest);
+ // FreeType(dest);
return true;
}
Class enumBase = null;
char * dataTypeString = null;
Class baseClass;
+ uint offsetBefore = _class.offset;
int offsetClass, totalSizeClass;
}
}
}
- if(mod.base.memberID)
+ // if(mod.base.memberID)
{
for(member = _class.membersAndProperties.first; member; member = member.next)
+ {
+ int offsetDiff = _class.offset - offsetBefore;
+ if(!member.isProperty && offsetDiff > 0)
+ {
+ member.offset += offsetDiff;
+ member.memberOffset += offsetDiff;
+ }
member.id += mod.base.memberID;
+ }
_class.memberID += mod.base.memberID;
_class.startMemberID += mod.base.memberID;
// Clear();
Empty();
- FASTLIST_LOOP(source, extentBox)
+ //FASTLIST_LOOP(source, extentBox)
+ for(extentBox = (BoxItem)source.first; extentBox; extentBox = (BoxItem)extentBox.next)
AddBox(extentBox.box);
}
// Clip all boxes of extent against inside of the new box
BoxItem extentBox, next;
- FASTLIST_LOOPN(this, extentBox, next)
+ //FASTLIST_LOOPN(this, extentBox, next) // Macros still mess up the parser!
+ for(extentBox = (BoxItem)this.first; extentBox; extentBox = next)
{
+ next = (BoxItem)extentBox.next;
if(box.left > extentBox.box.left) extentBox.box.left = box.left;
if(box.top > extentBox.box.top) extentBox.box.top = box.top;
if(box.right < extentBox.box.right) extentBox.box.right = box.right;
temp.Copy(this);
Empty();
- FASTLIST_LOOP(temp, extentBox)
+ for(extentBox = (BoxItem)temp.first; extentBox; extentBox = (BoxItem)extentBox.next)
{
if(extentBox.box.left < box.right && extentBox.box.right > box.left &&
extentBox.box.top < box.bottom && extentBox.box.bottom > box.top)
BoxItem extentBox, next;
// First pass: check if this box is not already covered by one of the extent's box
- FASTLIST_LOOP(this, extentBox)
+ for(extentBox = (BoxItem)this.first; extentBox; extentBox = (BoxItem)extentBox.next)
{
if(extentBox.box.left <= box.left && extentBox.box.right >= box.right &&
extentBox.box.top <= box.top && extentBox.box.bottom >= box.bottom)
}
// Second pass: only keep boxes not completely covered in the new box
- FASTLIST_LOOPN(this, extentBox, next)
+ for(extentBox = (BoxItem)this.first; extentBox; extentBox = next)
{
+ next = (BoxItem)extentBox.next;
if(extentBox.box.left >= box.left && extentBox.box.right <= box.right &&
extentBox.box.top >= box.top && extentBox.box.bottom <= box.bottom)
Delete(extentBox);
if(box.bottom >= box.top && box.right >= box.left)
{
// Optimization: if the resulting boxes touch, add them smarter
- FASTLIST_LOOP(this, extentBox)
+ for(extentBox = (BoxItem)this.first; extentBox; extentBox = (BoxItem)extentBox.next)
{
if(box.top == extentBox.box.top && box.bottom == extentBox.box.bottom)
{
{
BoxItem extentBox;
- FASTLIST_LOOP(b, extentBox)
+ for(extentBox = (BoxItem)b.first; extentBox; extentBox = (BoxItem)extentBox.next)
UnionBox(extentBox.box, temp);
}
Empty();
- FASTLIST_LOOP(b, extentBox)
+ for(extentBox = (BoxItem)b.first; extentBox; extentBox = (BoxItem)extentBox.next)
{
temp2.Copy(temp);
temp2.IntersectBox(extentBox.box);
void Exclusion(Extent b, Extent temp)
{
BoxItem extentBox;
- FASTLIST_LOOP(b, extentBox)
+ for(extentBox = (BoxItem)b.first; extentBox; extentBox = (BoxItem)extentBox.next)
ExcludeBox(extentBox.box, temp);
}
void Offset(int x, int y)
{
BoxItem extentBox;
- FASTLIST_LOOP(this, extentBox)
+ for(extentBox = (BoxItem)this.first; extentBox; extentBox = (BoxItem)extentBox.next)
{
extentBox.box.left += x;
extentBox.box.top += y;
dirty->Empty();
// Will need scrolledArea.x & scrolledArea.y to support multiple scrolls
- FASTLIST_LOOP(scrollExtent, scrollBox)
+ for(scrollBox = (BoxItem)scrollExtent.first; scrollBox; scrollBox = (BoxItem)scrollBox.next)
display.Scroll(scrollBox.box, scrolledArea.x, scrolledArea.y, dirty);
scrolledArea.x = 0;
printf("\n\nRendering %s (%x):\n------------------------------------------\n", _class.name, this);*/
#endif
- FASTLIST_LOOP(renderArea, extentBox)
+ for(extentBox = (BoxItem)renderArea.first; extentBox; extentBox = (BoxItem)extentBox.next)
{
Box box = extentBox.box;
{
// TO DO: There's an issue about draw over children...
// TO DO: Don't wanna go through this if method isn't used
- FASTLIST_LOOP(/*renderArea */overRenderArea, extentBox)
+ for(extentBox = (BoxItem)overRenderArea.first; extentBox; extentBox = (BoxItem)extentBox.next)
+ //FASTLIST_LOOP(/*renderArea */overRenderArea, extentBox)
{
Box box = extentBox.box;
//printf("\n\nUpdate:\n------------------------------------------\n");
#endif
- FASTLIST_LOOP(updateExtent, extentBox)
+ //FASTLIST_LOOP(updateExtent, extentBox)
+ for(extentBox = (BoxItem)updateExtent.first; extentBox; extentBox = (BoxItem)extentBox.next)
{
#ifdef _DEBUG
/*printf("Updating (%d, %d) - (%d, %d)\n",
{
BoxItem extentBox, next;
BoxItem first = (BoxItem)ACCESS_ITEM(dirtyBack, dirtyBack.first);
- FASTLIST_LOOPN(dirtyBack, extentBox, next)
+ for(extentBox = (BoxItem)dirtyBack.first; extentBox; extentBox = next)
{
+ next = (BoxItem)extentBox.next;
if(extentBox != first)
{
if(extentBox.box.left < first.box.left)
}
break;
case memoryErrorExp:
- sprintf(watchmsg, "Memory can't be read at %s", (exp.type == constantExp) ? exp.constant : null);
+ // Need to ensure when set to memoryErrorExp, constant is set
+ sprintf(watchmsg, "Memory can't be read at %s", /*(exp.type == constantExp) ? */exp.constant /*: null*/);
break;
case dereferenceErrorExp:
sprintf(watchmsg, "Dereference failure for \"%s\"", wh.expression);
else
{
char tempString[256];
- sprintf(watchmsg, "Evaluation failed for \"%s\" of type \"%s\"", wh.expression,
- exp.type.OnGetString(tempString, null, null));
+ if(exp.member.memberType == propertyMember)
+ sprintf(watchmsg, "Missing property evaluation support for \"%s\"", wh.expression);
+ else
+ sprintf(watchmsg, "Evaluation failed for \"%s\" of type \"%s\"", wh.expression,
+ exp.type.OnGetString(tempString, null, null));
}
break;
}
{
eval.active = true;
eval.error = none;
+#ifdef _DEBUG
+ if(!size)
+ printf("GdbReadMemoryString called with size = 0!\n");
+#endif
GdbCommand(false, "-data-read-memory 0x%08x %c, %d, %d, %d", address, format, size, rows, cols);
if(eval.active)
ide.outputView.debugBox.Logf("Debugger Error: GdbReadMemoryString\n");
eval.active = true;
eval.error = none;
GdbCommand(false, "-data-read-memory 0x%08x %c, 1, 1, %d", address, 'u', bytes);
+#ifdef _DEBUG
+ if(!bytes)
+ printf("GdbReadMemory called with bytes = 0!\n");
+#endif
if(eval.active)
ide.outputView.debugBox.Logf("Debugger Error: GdbReadMemory\n");
else if(eval.result && strcmp(eval.result, "N/A"))
*/}
}
else
+ {
exp.type = evalError;
+ exp.constant = PrintHexUInt(address);
+ }
break;
case shortType:
case intType:
}
}
else
+ {
+ exp.constant = CopyString("");
exp.type = evalError;
+ }
break;
case classType:
if(isPointer)
if(evaluation)
;
else
+ {
+ exp.constant = CopyString("");
exp.type = evalError;
+ }
break;
}
if(evalError != dummyExp)
+ {
exp.type = evalError;
+ exp.constant = CopyString("");
+ }
else
{
if(evaluation)
sprintf(temp, "%c%s", exp.op.op, exp.op.exp2.identifier.string);
evaluation = Debugger::EvaluateExpression(temp, &evalError);
if(evalError != dummyExp)
+ {
exp.type = evalError;
+ exp.constant = CopyString("");
+ }
else if(evaluation)
{
expNew = ParseExpressionString(evaluation);
if(evalError != dummyExp)
{
exp1.type = evalError;
+ exp.constant = CopyString("");
expError = exp1;
}
else
address += offset * size;
evaluation = Debugger::ReadMemory(address, size, format, &evalError);
if(evalError != dummyExp)
+ {
exp.type = evalError;
+ exp.constant = CopyString("");
+ }
else if(evaluation)
{
expNew = ParseExpressionString(evaluation);
uint address;
Expression prev = exp.prev, next = exp.next;
char format;
- int size = ComputeTypeSize(member.dataType);
+ int size;
Expression expNew;
TypeKind kind = dummyType;
Type dataType = member.dataType;
(dataType._class.registered.type == enumClass || dataType._class.registered.type == bitClass || dataType._class.registered.type == unitClass))
dataType = dataType._class.registered.dataType;
+ size = ComputeTypeSize(member.dataType);
+
format = GetGdbFormatChar(dataType);
//if(memberExp.address)
{
if(propertyClass.type == structClass || propertyClass.type == normalClass || propertyClass.type == noHeadClass)
{
- Expression computed = CopyExpression(member.initializer.exp);
+ Expression computed;
+#ifdef _DEBUG
+ /*char debugExpString[4096];
+ debugExpString[0] = '\0';
+ PrintExpression(member.initializer.exp, debugExpString);*/
+#endif
+ computed = CopyExpression(member.initializer.exp);
if(computed)
{
ComputeExpression(computed);