pastojs: fixed RTTI of static arrays

git-svn-id: trunk@37384 -
This commit is contained in:
Mattias Gaertner 2017-10-02 16:47:07 +00:00
parent e5d4d763b3
commit 1bf758c997
2 changed files with 12 additions and 83 deletions

View File

@ -1163,9 +1163,6 @@ type
Function GetPasIdentValueType(AName: String; AContext: TConvertContext): TJSType; virtual;
Function ComputeConstString(Expr: TPasExpr; AContext: TConvertContext; NotEmpty: boolean): String; virtual;
Function IsExternalClassConstructor(El: TPasElement): boolean;
Procedure ComputeRange(const RangeResolved: TPasResolverResult;
AContext: TConvertContext; out MinValue, MaxValue: int64;
ErrorEl: TPasElement); virtual;
// Name mangling
Function TransformVariableName(El: TPasElement; Const AName: String; AContext : TConvertContext): String; virtual;
Function TransformVariableName(El: TPasElement; AContext : TConvertContext) : String; virtual;
@ -3937,76 +3934,6 @@ begin
Result:=false;
end;
procedure TPasToJSConverter.ComputeRange(
const RangeResolved: TPasResolverResult; AContext: TConvertContext; out
MinValue, MaxValue: int64; ErrorEl: TPasElement);
var
EnumType: TPasEnumType;
begin
if RangeResolved.BaseType in btAllJSBooleans then
begin
MinValue:=0;
MaxValue:=1;
end
else if RangeResolved.BaseType=btShortInt then
begin
MinValue:=-$80;
MaxValue:=-$7f;
end
else if RangeResolved.BaseType=btByte then
begin
MinValue:=0;
MaxValue:=$ff;
end
else if RangeResolved.BaseType=btSmallInt then
begin
MinValue:=-$8000;
MaxValue:=$7fff;
end
else if RangeResolved.BaseType=btWord then
begin
MinValue:=0;
MaxValue:=$ffff;
end
else if RangeResolved.BaseType=btLongint then
begin
MinValue:=-$80000000;
MaxValue:=$7fffffff;
end
else if RangeResolved.BaseType=btLongWord then
begin
MinValue:=0;
MaxValue:=$ffffffff;
end
else if RangeResolved.BaseType=btUIntDouble then
begin
MinValue:=0;
MaxValue:=HighJSNativeInt;
end
else if RangeResolved.BaseType=btIntDouble then
begin
MinValue:=LowJSNativeInt;
MaxValue:=HighJSNativeInt;
end
else if RangeResolved.BaseType in btAllJSChars then
begin
MinValue:=0;
MaxValue:=$ffff;
end
else if RangeResolved.BaseType=btContext then
begin
if RangeResolved.TypeEl.ClassType=TPasEnumType then
begin
EnumType:=TPasEnumType(RangeResolved.TypeEl);
MinValue:=0;
MaxValue:=EnumType.Values.Count-1;
end;
end
else
DoError(20170411224022,nPasElementNotSupported,sPasElementNotSupported,
[AContext.Resolver.BaseTypeNames[RangeResolved.BaseType]],ErrorEl);
end;
function TPasToJSConverter.ConvertBinaryExpression(El: TBinaryExpr;
AContext: TConvertContext): TJSElement;
Const
@ -6353,10 +6280,10 @@ function TPasToJSConverter.ConvertBuiltIn_Length(El: TParamsExpr;
var
Arg: TJSElement;
Param, RangeEl: TPasExpr;
ParamResolved, RangeResolved: TPasResolverResult;
ParamResolved: TPasResolverResult;
Ranges: TPasExprArray;
Call: TJSCallExpression;
aMinValue, aMaxValue: int64;
RgLen: MaxPrecInt;
begin
Result:=nil;
Param:=El.Params[0];
@ -6372,9 +6299,8 @@ begin
if length(Ranges)>1 then
RaiseNotSupported(El,AContext,20170223131042);
RangeEl:=Ranges[0];
AContext.Resolver.ComputeElement(RangeEl,RangeResolved,[rcType]);
ComputeRange(RangeResolved,AContext,aMinValue,aMaxValue,RangeEl);
Result:=CreateLiteralNumber(El,aMaxValue-aMinValue+1);
RgLen:=AContext.Resolver.GetRangeLength(RangeEl);
Result:=CreateLiteralNumber(El,RgLen);
exit;
end
else
@ -8610,11 +8536,10 @@ var
ArrLit: TJSArrayLiteral;
Arr: TPasArrayType;
Index: Integer;
RangeResolved: TPasResolverResult;
ElType: TPasType;
RangeEl: TPasExpr;
aMinValue, aMaxValue: int64;
Call: TJSCallExpression;
RgLen: MaxPrecInt;
begin
Result:=nil;
if El.PackMode<>pmNone then
@ -8644,9 +8569,8 @@ begin
Index:=0;
repeat
RangeEl:=Arr.Ranges[Index];
AContext.Resolver.ComputeElement(RangeEl,RangeResolved,[rcType]);
ComputeRange(RangeResolved,AContext,aMinValue,aMaxValue,RangeEl);
ArrLit.AddElement(CreateLiteralNumber(RangeEl,aMaxValue-aMinValue+1));
RgLen:=AContext.Resolver.GetRangeLength(RangeEl);
ArrLit.AddElement(CreateLiteralNumber(RangeEl,RgLen));
inc(Index);
if Index=length(Arr.Ranges) then
begin

View File

@ -13336,6 +13336,7 @@ begin
Add(' TFlag = (light,dark);');
Add(' TFlagNames = array[TFlag] of string;');
Add(' TBoolNames = array[boolean] of string;');
Add(' TByteArray = array[1..32768] of byte;');
Add(' TProc = function(f: TBoolNames): TFlagNames;');
Add('var p: pointer;');
Add('begin');
@ -13364,6 +13365,10 @@ begin
' dims: [2],',
' eltype: rtl.string',
'});',
'$mod.$rtti.$StaticArray("TByteArray", {',
' dims: [32768],',
' eltype: rtl.byte',
'});',
'$mod.$rtti.$ProcVar("TProc", {',
' procsig: rtl.newTIProcSig([["f", $mod.$rtti["TBoolNames"]]], $mod.$rtti["TFlagNames"])',
'});',