pastojs: jsvalue is classoftype

git-svn-id: trunk@38002 -
This commit is contained in:
Mattias Gaertner 2018-01-19 00:01:57 +00:00
parent a112eae49a
commit 1bdff08a98
2 changed files with 35 additions and 19 deletions

View File

@ -2785,6 +2785,8 @@ procedure TPas2JSResolver.ComputeBinaryExprRes(Bin: TBinaryExpr; out
SetResolverValueExpr(ResolvedEl,BaseType,BaseTypes[BaseType],Bin,[rrfReadable]);
end;
var
RightTypeEl: TPasType;
begin
if (LeftResolved.BaseType=btCustom)
or (RightResolved.BaseType=btCustom) then
@ -2800,6 +2802,14 @@ begin
SetBaseType(btBoolean);
exit;
end;
RightTypeEl:=ResolveAliasType(RightResolved.TypeEl);
if (RightTypeEl is TPasClassOfType) then
begin
// e.g. if aJSValue is TClass then ;
// or if aJSValue is ImageClass then ;
SetBaseType(btBoolean);
exit;
end;
end;
end;
@ -4487,10 +4497,12 @@ begin
// aJSValue is ... -> "rtl.isExt(A,B)"
Call.Expr:=CreateMemberExpression([FBuiltInNames[pbivnRTL],FBuiltInNames[pbifnIsExt]]);
Call.AddArg(B); B:=nil;
if TypeEl is TPasClassType then
if RightTypeEl is TPasClassType then
Call.AddArg(CreateLiteralNumber(El.right,IsExtModePasClassInstance))
else if TypeEl is TPasClassOfType then
Call.AddArg(CreateLiteralNumber(El.right,IsExtModePasClass));
else if RightTypeEl is TPasClassOfType then
Call.AddArg(CreateLiteralNumber(El.right,IsExtModePasClass))
else
RaiseNotSupported(El,AContext,20180119005904);
end
else if (RightTypeEl is TPasClassType) and TPasClassType(RightTypeEl).IsExternal then
begin

View File

@ -13232,22 +13232,25 @@ end;
procedure TTestModule.TestJSValue_ClassOf;
begin
StartProgram(false);
Add('type');
Add(' TClass = class of TObject;');
Add(' TObject = class');
Add(' end;');
Add(' TBirds = class of TBird;');
Add(' TBird = class(TObject) end;');
Add('var');
Add(' v: jsvalue;');
Add(' c: TClass;');
Add('begin');
Add(' v:=c;');
Add(' v:=TObject;');
Add(' v:=TClass(c);');
Add(' v:=TBirds(c);');
Add(' c:=TClass(v);');
Add(' c:=TBirds(v);');
Add([
'type',
' TClass = class of TObject;',
' TObject = class',
' end;',
' TBirds = class of TBird;',
' TBird = class(TObject) end;',
'var',
' v: jsvalue;',
' c: TClass;',
'begin',
' v:=c;',
' v:=TObject;',
' v:=TClass(c);',
' v:=TBirds(c);',
' c:=TClass(v);',
' c:=TBirds(v);',
' if v is TClass then ;',
'']);
ConvertProgram;
CheckSource('TestJSValue_ClassOf',
LinesToStr([ // statements
@ -13269,6 +13272,7 @@ begin
'$mod.v = $mod.c;',
'$mod.c = rtl.getObject($mod.v);',
'$mod.c = rtl.getObject($mod.v);',
'if (rtl.isExt($mod.v, $mod.TObject, 2)) ;',
'']));
end;