mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-26 09:49:10 +02:00
pastojs: fixed RTTI of static arrays
git-svn-id: trunk@37384 -
This commit is contained in:
parent
e5d4d763b3
commit
1bf758c997
@ -1163,9 +1163,6 @@ type
|
|||||||
Function GetPasIdentValueType(AName: String; AContext: TConvertContext): TJSType; virtual;
|
Function GetPasIdentValueType(AName: String; AContext: TConvertContext): TJSType; virtual;
|
||||||
Function ComputeConstString(Expr: TPasExpr; AContext: TConvertContext; NotEmpty: boolean): String; virtual;
|
Function ComputeConstString(Expr: TPasExpr; AContext: TConvertContext; NotEmpty: boolean): String; virtual;
|
||||||
Function IsExternalClassConstructor(El: TPasElement): boolean;
|
Function IsExternalClassConstructor(El: TPasElement): boolean;
|
||||||
Procedure ComputeRange(const RangeResolved: TPasResolverResult;
|
|
||||||
AContext: TConvertContext; out MinValue, MaxValue: int64;
|
|
||||||
ErrorEl: TPasElement); virtual;
|
|
||||||
// Name mangling
|
// Name mangling
|
||||||
Function TransformVariableName(El: TPasElement; Const AName: String; AContext : TConvertContext): String; virtual;
|
Function TransformVariableName(El: TPasElement; Const AName: String; AContext : TConvertContext): String; virtual;
|
||||||
Function TransformVariableName(El: TPasElement; AContext : TConvertContext) : String; virtual;
|
Function TransformVariableName(El: TPasElement; AContext : TConvertContext) : String; virtual;
|
||||||
@ -3937,76 +3934,6 @@ begin
|
|||||||
Result:=false;
|
Result:=false;
|
||||||
end;
|
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;
|
function TPasToJSConverter.ConvertBinaryExpression(El: TBinaryExpr;
|
||||||
AContext: TConvertContext): TJSElement;
|
AContext: TConvertContext): TJSElement;
|
||||||
Const
|
Const
|
||||||
@ -6353,10 +6280,10 @@ function TPasToJSConverter.ConvertBuiltIn_Length(El: TParamsExpr;
|
|||||||
var
|
var
|
||||||
Arg: TJSElement;
|
Arg: TJSElement;
|
||||||
Param, RangeEl: TPasExpr;
|
Param, RangeEl: TPasExpr;
|
||||||
ParamResolved, RangeResolved: TPasResolverResult;
|
ParamResolved: TPasResolverResult;
|
||||||
Ranges: TPasExprArray;
|
Ranges: TPasExprArray;
|
||||||
Call: TJSCallExpression;
|
Call: TJSCallExpression;
|
||||||
aMinValue, aMaxValue: int64;
|
RgLen: MaxPrecInt;
|
||||||
begin
|
begin
|
||||||
Result:=nil;
|
Result:=nil;
|
||||||
Param:=El.Params[0];
|
Param:=El.Params[0];
|
||||||
@ -6372,9 +6299,8 @@ begin
|
|||||||
if length(Ranges)>1 then
|
if length(Ranges)>1 then
|
||||||
RaiseNotSupported(El,AContext,20170223131042);
|
RaiseNotSupported(El,AContext,20170223131042);
|
||||||
RangeEl:=Ranges[0];
|
RangeEl:=Ranges[0];
|
||||||
AContext.Resolver.ComputeElement(RangeEl,RangeResolved,[rcType]);
|
RgLen:=AContext.Resolver.GetRangeLength(RangeEl);
|
||||||
ComputeRange(RangeResolved,AContext,aMinValue,aMaxValue,RangeEl);
|
Result:=CreateLiteralNumber(El,RgLen);
|
||||||
Result:=CreateLiteralNumber(El,aMaxValue-aMinValue+1);
|
|
||||||
exit;
|
exit;
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
@ -8610,11 +8536,10 @@ var
|
|||||||
ArrLit: TJSArrayLiteral;
|
ArrLit: TJSArrayLiteral;
|
||||||
Arr: TPasArrayType;
|
Arr: TPasArrayType;
|
||||||
Index: Integer;
|
Index: Integer;
|
||||||
RangeResolved: TPasResolverResult;
|
|
||||||
ElType: TPasType;
|
ElType: TPasType;
|
||||||
RangeEl: TPasExpr;
|
RangeEl: TPasExpr;
|
||||||
aMinValue, aMaxValue: int64;
|
|
||||||
Call: TJSCallExpression;
|
Call: TJSCallExpression;
|
||||||
|
RgLen: MaxPrecInt;
|
||||||
begin
|
begin
|
||||||
Result:=nil;
|
Result:=nil;
|
||||||
if El.PackMode<>pmNone then
|
if El.PackMode<>pmNone then
|
||||||
@ -8644,9 +8569,8 @@ begin
|
|||||||
Index:=0;
|
Index:=0;
|
||||||
repeat
|
repeat
|
||||||
RangeEl:=Arr.Ranges[Index];
|
RangeEl:=Arr.Ranges[Index];
|
||||||
AContext.Resolver.ComputeElement(RangeEl,RangeResolved,[rcType]);
|
RgLen:=AContext.Resolver.GetRangeLength(RangeEl);
|
||||||
ComputeRange(RangeResolved,AContext,aMinValue,aMaxValue,RangeEl);
|
ArrLit.AddElement(CreateLiteralNumber(RangeEl,RgLen));
|
||||||
ArrLit.AddElement(CreateLiteralNumber(RangeEl,aMaxValue-aMinValue+1));
|
|
||||||
inc(Index);
|
inc(Index);
|
||||||
if Index=length(Arr.Ranges) then
|
if Index=length(Arr.Ranges) then
|
||||||
begin
|
begin
|
||||||
|
@ -13336,6 +13336,7 @@ begin
|
|||||||
Add(' TFlag = (light,dark);');
|
Add(' TFlag = (light,dark);');
|
||||||
Add(' TFlagNames = array[TFlag] of string;');
|
Add(' TFlagNames = array[TFlag] of string;');
|
||||||
Add(' TBoolNames = array[boolean] of string;');
|
Add(' TBoolNames = array[boolean] of string;');
|
||||||
|
Add(' TByteArray = array[1..32768] of byte;');
|
||||||
Add(' TProc = function(f: TBoolNames): TFlagNames;');
|
Add(' TProc = function(f: TBoolNames): TFlagNames;');
|
||||||
Add('var p: pointer;');
|
Add('var p: pointer;');
|
||||||
Add('begin');
|
Add('begin');
|
||||||
@ -13364,6 +13365,10 @@ begin
|
|||||||
' dims: [2],',
|
' dims: [2],',
|
||||||
' eltype: rtl.string',
|
' eltype: rtl.string',
|
||||||
'});',
|
'});',
|
||||||
|
'$mod.$rtti.$StaticArray("TByteArray", {',
|
||||||
|
' dims: [32768],',
|
||||||
|
' eltype: rtl.byte',
|
||||||
|
'});',
|
||||||
'$mod.$rtti.$ProcVar("TProc", {',
|
'$mod.$rtti.$ProcVar("TProc", {',
|
||||||
' procsig: rtl.newTIProcSig([["f", $mod.$rtti["TBoolNames"]]], $mod.$rtti["TFlagNames"])',
|
' procsig: rtl.newTIProcSig([["f", $mod.$rtti["TBoolNames"]]], $mod.$rtti["TFlagNames"])',
|
||||||
'});',
|
'});',
|
||||||
|
Loading…
Reference in New Issue
Block a user