jsbase.pp 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  1. unit jsbase;
  2. {$mode objfpc}{$H+}
  3. interface
  4. uses
  5. Classes, SysUtils;
  6. Type
  7. TJSType = (jstUNDEFINED,jstNull,jstBoolean,jstNumber,jstString,jstObject,jstReference,JSTCompletion);
  8. TJSString = WideString;
  9. TJSNumber = Double;
  10. { TJSValue }
  11. TJSValue = Class(TObject)
  12. private
  13. FValueType: TJSType;
  14. FValue : Record
  15. Case Integer of
  16. 0 : (P : Pointer);
  17. 1 : (F : TJSNumber);
  18. 2 : (I : Integer);
  19. end;
  20. procedure ClearValue(ANewValue: TJSType);
  21. function GetAsBoolean: Boolean;
  22. function GetAsCompletion: TObject;
  23. function GetAsNumber: TJSNumber;
  24. function GetAsObject: TObject;
  25. function GetAsReference: TObject;
  26. function GetAsString: TJSString;
  27. function GetIsNull: Boolean;
  28. function GetIsUndefined: Boolean;
  29. procedure SetAsBoolean(const AValue: Boolean);
  30. procedure SetAsCompletion(const AValue: TObject);
  31. procedure SetAsNumber(const AValue: TJSNumber);
  32. procedure SetAsObject(const AValue: TObject);
  33. procedure SetAsReference(const AValue: TObject);
  34. procedure SetAsString(const AValue: TJSString);
  35. procedure SetIsNull(const AValue: Boolean);
  36. procedure SetIsUndefined(const AValue: Boolean);
  37. Public
  38. Constructor Create;
  39. Constructor CreateNull;
  40. Constructor Create(ANumber : TJSNumber);
  41. Constructor Create(ABoolean : Boolean);
  42. Constructor Create(AString: TJSString);
  43. Destructor Destroy; override;
  44. Property ValueType : TJSType Read FValueType;
  45. Property IsUndefined : Boolean Read GetIsUndefined Write SetIsUndefined;
  46. Property IsNull : Boolean Read GetIsNull Write SetIsNull;
  47. Property AsNumber : TJSNumber Read GetAsNumber Write SetAsNumber;
  48. Property AsBoolean : Boolean Read GetAsBoolean Write SetAsBoolean;
  49. Property AsObject : TObject Read GetAsObject Write SetAsObject;
  50. Property AsString : TJSString Read GetAsString Write SetAsString;
  51. Property AsReference : TObject Read GetAsReference Write SetAsReference;
  52. Property AsCompletion : TObject Read GetAsCompletion Write SetAsCompletion;
  53. end;
  54. implementation
  55. { TJSValue }
  56. function TJSValue.GetAsBoolean: Boolean;
  57. begin
  58. If (ValueType=jstBoolean) then
  59. Result:=(FValue.I<>0)
  60. else
  61. Result:=False;
  62. end;
  63. function TJSValue.GetAsCompletion: TObject;
  64. begin
  65. Result:=TObject(FValue.P);
  66. end;
  67. function TJSValue.GetAsNumber: TJSNumber;
  68. begin
  69. If (ValueType=jstNumber) then
  70. Result:=FValue.F
  71. else
  72. Result:=0.0;
  73. end;
  74. function TJSValue.GetAsObject: TObject;
  75. begin
  76. If (ValueType=jstObject) then
  77. Result:=TObject(FValue.P)
  78. else
  79. Result:=nil;
  80. end;
  81. function TJSValue.GetAsReference: TObject;
  82. begin
  83. If (ValueType=jstReference) then
  84. Result:=TObject(FValue.P)
  85. else
  86. Result:=nil;
  87. end;
  88. function TJSValue.GetAsString: TJSString;
  89. begin
  90. If (ValueType=jstString) then
  91. Result:=TJSString(FValue.P)
  92. else
  93. Result:='';
  94. end;
  95. function TJSValue.GetIsNull: Boolean;
  96. begin
  97. Result:=(ValueType=jstNull);
  98. end;
  99. function TJSValue.GetIsUndefined: Boolean;
  100. begin
  101. Result:=(fValueType=jstUndefined);
  102. end;
  103. procedure TJSValue.ClearValue(ANewValue : TJSType);
  104. begin
  105. Case FValueType of
  106. jstString : String(FValue.P):='';
  107. jstNumber : FValue.F:=0;
  108. else
  109. FValue.I:=0;
  110. end;
  111. FValueType:=ANewValue;
  112. end;
  113. procedure TJSValue.SetAsBoolean(const AValue: Boolean);
  114. begin
  115. ClearValue(jstBoolean);
  116. FValue.I:=Ord(AValue);
  117. end;
  118. procedure TJSValue.SetAsCompletion(const AValue: TObject);
  119. begin
  120. ClearValue(jstBoolean);
  121. FValue.P:=AValue;
  122. end;
  123. procedure TJSValue.SetAsNumber(const AValue: TJSNumber);
  124. begin
  125. ClearValue(jstNumber);
  126. FValue.F:=AValue;
  127. end;
  128. procedure TJSValue.SetAsObject(const AValue: TObject);
  129. begin
  130. ClearValue(jstObject);
  131. FValue.P:=AVAlue;
  132. end;
  133. procedure TJSValue.SetAsReference(const AValue: TObject);
  134. begin
  135. ClearValue(jstReference);
  136. FValue.P:=AVAlue;
  137. end;
  138. procedure TJSValue.SetAsString(const AValue: TJSString);
  139. begin
  140. ClearValue(jstString);
  141. TJSString(FValue.P):=AValue;
  142. end;
  143. procedure TJSValue.SetIsNull(const AValue: Boolean);
  144. begin
  145. ClearValue(jstNull);
  146. end;
  147. procedure TJSValue.SetIsUndefined(const AValue: Boolean);
  148. begin
  149. ClearValue(jstUndefined);
  150. end;
  151. Constructor TJSValue.CreateNull;
  152. begin
  153. IsNull:=True;
  154. end;
  155. Constructor TJSValue.Create;
  156. begin
  157. IsUndefined:=True;
  158. end;
  159. Constructor TJSValue.Create(ANumber: TJSNumber);
  160. begin
  161. AsNumber:=ANumber;
  162. end;
  163. Constructor TJSValue.Create(ABoolean: Boolean);
  164. begin
  165. AsBoolean:=ABoolean;
  166. end;
  167. Constructor TJSValue.Create(AString: TJSString);
  168. begin
  169. AsString:=AString;
  170. end;
  171. Destructor TJSValue.Destroy;
  172. begin
  173. ClearValue(jstUndefined);
  174. inherited Destroy;
  175. end;
  176. end.