diff --git a/ASTPlayground/ASTPlayground.dproj b/ASTPlayground/ASTPlayground.dproj index b988ee1..4b373f7 100644 --- a/ASTPlayground/ASTPlayground.dproj +++ b/ASTPlayground/ASTPlayground.dproj @@ -4,7 +4,7 @@ 20.3 FMX True - Release + Debug Win64 ASTPlayground 2 diff --git a/Src/AST/Myc.Ast.Scope.pas b/Src/AST/Myc.Ast.Scope.pas index 5335388..b129a43 100644 --- a/Src/AST/Myc.Ast.Scope.pas +++ b/Src/AST/Myc.Ast.Scope.pas @@ -78,9 +78,6 @@ constructor TExecutionScope.Create( const ADescriptor: IScopeDescriptor; const ACapturedUpvalues: TArray ); -var - slotCount: Integer; - i: Integer; begin inherited Create; FParent := AParent; @@ -89,10 +86,7 @@ begin FCapturedUpvalues := ACapturedUpvalues; // Store upvalues if ADescriptor <> nil then - begin - slotCount := ADescriptor.SlotCount; - SetLength(FValues, slotCount); - end; + SetLength(FValues, ADescriptor.SlotCount); end; destructor TExecutionScope.Destroy; diff --git a/Src/Data/Myc.Data.Value.pas b/Src/Data/Myc.Data.Value.pas index 9194d72..0c986a7 100644 --- a/Src/Data/Myc.Data.Value.pas +++ b/Src/Data/Myc.Data.Value.pas @@ -210,18 +210,75 @@ begin end; function TDataValue.ToString: String; +var + sb: TStringBuilder; + field: TScalarRecordField; + first: Boolean; begin case FKind of vkScalar: Result := FScalar.ToString; vkInterface: Result := ''; - vkText: Result := AsText; - vkSeries: Result := ''; - vkRecordSeries: Result := ''; - vkRecord: Result := ''; - vkMemberSeries: Result := ''; + vkText: Result := '"' + AsText + '"'; + vkSeries: + begin + var series := AsSeries.Value; + // Add type and count for series + Result := Format('[%d]>', [series.Kind.ToString, series.Items.Count]); + end; + vkRecordSeries: + begin + var series := AsRecordSeries.Value; + sb := TStringBuilder.Create; + try + sb.Append('{'); + first := True; + for field in series.Def.Fields do + begin + if not first then + sb.Append(','); + sb.Append(field.Name); + first := False; + end; + sb.Append('}'); + // Add field names and count for record series + Result := Format('', [sb.ToString, series.Count]); + finally + sb.Free; + end; + end; + vkRecord: + begin + var rec := AsRecord.Value; + sb := TStringBuilder.Create; + try + sb.Append('{'); + first := True; + for field in rec.Def.Fields do + begin + if not first then + sb.Append(','); + sb.Append(field.Name); + first := False; + end; + sb.Append('}'); + // Add field names for records + Result := Format('', [sb.ToString]); + finally + sb.Free; + end; + end; + vkMemberSeries: + begin + var series := AsMemberSeries.Value; + // Add type and count for member series + Result := Format('[%d]>', [series.Kind.ToString, series.Count]); + end; vkVoid: Result := ''; vkMethod: Result := ''; - vkGeneric: Result := ''; + vkGeneric: + // Getting meaningful type information for vkGeneric is not easily possible + // without storing additional RTTI, as the specific type of T in TVal is lost. + Result := ''; else Result := '[Unknown DataValue]'; end;