| OLD | NEW |
| (Empty) |
| 1 #ifndef SkScript2_DEFINED | |
| 2 #define SkScript2_DEFINED | |
| 3 | |
| 4 #include "SkOperand2.h" | |
| 5 #include "SkStream.h" | |
| 6 #include "SkTDArray.h" | |
| 7 #include "SkTDArray_Experimental.h" | |
| 8 #include "SkTDict.h" | |
| 9 #include "SkTDStack.h" | |
| 10 | |
| 11 typedef SkLongArray(SkString*) SkTDStringArray; | |
| 12 | |
| 13 class SkAnimateMaker; | |
| 14 class SkScriptCallBack; | |
| 15 | |
| 16 class SkScriptEngine2 { | |
| 17 public: | |
| 18 enum Error { | |
| 19 kNoError, | |
| 20 kArrayIndexOutOfBounds, | |
| 21 kCouldNotFindReferencedID, | |
| 22 kFunctionCallFailed, | |
| 23 kMemberOpFailed, | |
| 24 kPropertyOpFailed | |
| 25 }; | |
| 26 | |
| 27 enum Attrs { | |
| 28 kConstant, | |
| 29 kVariable | |
| 30 }; | |
| 31 | |
| 32 SkScriptEngine2(SkOperand2::OpType returnType); | |
| 33 ~SkScriptEngine2(); | |
| 34 bool convertTo(SkOperand2::OpType , SkScriptValue2* ); | |
| 35 bool evaluateScript(const char** script, SkScriptValue2* value); | |
| 36 void forget(SkOpArray* array); | |
| 37 Error getError() { return fError; } | |
| 38 SkOperand2::OpType getReturnType() { return fReturnType; } | |
| 39 void track(SkOpArray* array) { | |
| 40 SkASSERT(fTrackArray.find(array) < 0); | |
| 41 *fTrackArray.append() = array; } | |
| 42 void track(SkString* string) { | |
| 43 SkASSERT(fTrackString.find(string) < 0); | |
| 44 *fTrackString.append() = string; | |
| 45 } | |
| 46 static bool ConvertTo(SkScriptEngine2* , SkOperand2::OpType toType, SkSc
riptValue2* value); | |
| 47 static SkScalar IntToScalar(int32_t ); | |
| 48 static bool ValueToString(const SkScriptValue2& value, SkString* string)
; | |
| 49 | |
| 50 enum Op { // used by tokenizer attribute table | |
| 51 kUnassigned, | |
| 52 kAdd, | |
| 53 kBitAnd, | |
| 54 kBitNot, | |
| 55 kBitOr, | |
| 56 kDivide, | |
| 57 kEqual, | |
| 58 kFlipOps, | |
| 59 kGreaterEqual, | |
| 60 kLogicalAnd, | |
| 61 kLogicalNot, | |
| 62 kLogicalOr, | |
| 63 kMinus, | |
| 64 kModulo, | |
| 65 kMultiply, | |
| 66 kShiftLeft, | |
| 67 kShiftRight, // signed | |
| 68 kSubtract, | |
| 69 kXor, | |
| 70 // following not in attribute table | |
| 71 kArrayOp, | |
| 72 kElse, | |
| 73 kIf, | |
| 74 kParen, | |
| 75 kLastLogicalOp, | |
| 76 kArtificialOp = 0x20 | |
| 77 }; | |
| 78 | |
| 79 enum TypeOp { // generated by tokenizer | |
| 80 kNop, // should never get generated | |
| 81 kAccumulatorPop, | |
| 82 kAccumulatorPush, | |
| 83 kAddInt, | |
| 84 kAddScalar, | |
| 85 kAddString, // string concat | |
| 86 kArrayIndex, | |
| 87 kArrayParam, | |
| 88 kArrayToken, | |
| 89 kBitAndInt, | |
| 90 kBitNotInt, | |
| 91 kBitOrInt, | |
| 92 kBoxToken, | |
| 93 kCallback, | |
| 94 kDivideInt, | |
| 95 kDivideScalar, | |
| 96 kDotOperator, | |
| 97 kElseOp, | |
| 98 kEnd, | |
| 99 kEqualInt, | |
| 100 kEqualScalar, | |
| 101 kEqualString, | |
| 102 kFunctionCall, | |
| 103 kFlipOpsOp, | |
| 104 kFunctionToken, | |
| 105 kGreaterEqualInt, | |
| 106 kGreaterEqualScalar, | |
| 107 kGreaterEqualString, | |
| 108 kIfOp, | |
| 109 kIntToScalar, | |
| 110 kIntToScalar2, | |
| 111 kIntToString, | |
| 112 kIntToString2, | |
| 113 kIntegerAccumulator, | |
| 114 kIntegerOperand, | |
| 115 kLogicalAndInt, | |
| 116 kLogicalNotInt, | |
| 117 kLogicalOrInt, | |
| 118 kMemberOp, | |
| 119 kMinusInt, | |
| 120 kMinusScalar, | |
| 121 kModuloInt, | |
| 122 kModuloScalar, | |
| 123 kMultiplyInt, | |
| 124 kMultiplyScalar, | |
| 125 kPropertyOp, | |
| 126 kScalarAccumulator, | |
| 127 kScalarOperand, | |
| 128 kScalarToInt, | |
| 129 kScalarToInt2, | |
| 130 kScalarToString, | |
| 131 kScalarToString2, | |
| 132 kShiftLeftInt, | |
| 133 kShiftRightInt, // signed | |
| 134 kStringAccumulator, | |
| 135 kStringOperand, | |
| 136 kStringToInt, | |
| 137 kStringToScalar, | |
| 138 kStringToScalar2, | |
| 139 kStringTrack, | |
| 140 kSubtractInt, | |
| 141 kSubtractScalar, | |
| 142 kToBool, | |
| 143 kUnboxToken, | |
| 144 kUnboxToken2, | |
| 145 kXorInt, | |
| 146 kLastTypeOp | |
| 147 }; | |
| 148 | |
| 149 enum OpBias { | |
| 150 kNoBias, | |
| 151 kTowardsNumber = 0, | |
| 152 kTowardsString | |
| 153 }; | |
| 154 | |
| 155 protected: | |
| 156 | |
| 157 enum BraceStyle { | |
| 158 // kStructBrace, | |
| 159 kArrayBrace, | |
| 160 kFunctionBrace | |
| 161 }; | |
| 162 | |
| 163 enum AddTokenRegister { | |
| 164 kAccumulator, | |
| 165 kOperand | |
| 166 }; | |
| 167 | |
| 168 enum ResultIsBoolean { | |
| 169 kResultIsNotBoolean, | |
| 170 kResultIsBoolean | |
| 171 }; | |
| 172 | |
| 173 struct OperatorAttributes { | |
| 174 unsigned int fLeftType : 3; // SkOpType union, but only lowe
r values | |
| 175 unsigned int fRightType : 3; // SkOpType union, but only low
er values | |
| 176 OpBias fBias : 1; | |
| 177 ResultIsBoolean fResultIsBoolean : 1; | |
| 178 }; | |
| 179 | |
| 180 struct Branch { | |
| 181 Branch() { | |
| 182 } | |
| 183 | |
| 184 Branch(Op op, int depth, unsigned offset) : fOffset(offset), fOp
StackDepth(depth), fOperator(op), | |
| 185 fPrimed(kIsNotPrimed), fDone(kIsNotDone) { | |
| 186 } | |
| 187 | |
| 188 enum Primed { | |
| 189 kIsNotPrimed, | |
| 190 kIsPrimed | |
| 191 }; | |
| 192 | |
| 193 enum Done { | |
| 194 kIsNotDone, | |
| 195 kIsDone, | |
| 196 }; | |
| 197 | |
| 198 unsigned fOffset : 16; // offset in generated stream where branc
h needs to go | |
| 199 int fOpStackDepth : 7; // depth when operator was found | |
| 200 Op fOperator : 6; // operand which generated branch | |
| 201 mutable Primed fPrimed : 1; // mark when next instruction ge
nerates branch | |
| 202 Done fDone : 1; // mark when branch is complete | |
| 203 void prime() { fPrimed = kIsPrimed; } | |
| 204 void resolve(SkDynamicMemoryWStream* , size_t offset); | |
| 205 }; | |
| 206 | |
| 207 static const OperatorAttributes gOpAttributes[]; | |
| 208 static const signed char gPrecedence[]; | |
| 209 static const TypeOp gTokens[]; | |
| 210 void addToken(TypeOp ); | |
| 211 void addTokenConst(SkScriptValue2* , AddTokenRegister , SkOperand2::OpTy
pe , TypeOp ); | |
| 212 void addTokenInt(int ); | |
| 213 void addTokenScalar(SkScalar ); | |
| 214 void addTokenString(const SkString& ); | |
| 215 void addTokenValue(const SkScriptValue2& , AddTokenRegister ); | |
| 216 int arithmeticOp(char ch, char nextChar, bool lastPush); | |
| 217 bool convertParams(SkTDArray<SkScriptValue2>* , | |
| 218 const SkOperand2::OpType* paramTypes, int paramTypeCount); | |
| 219 void convertToString(SkOperand2* operand, SkOperand2::OpType type) { | |
| 220 SkScriptValue2 scriptValue; | |
| 221 scriptValue.fOperand = *operand; | |
| 222 scriptValue.fType = type; | |
| 223 convertTo(SkOperand2::kString, &scriptValue); | |
| 224 *operand = scriptValue.fOperand; | |
| 225 } | |
| 226 bool evaluateDot(const char*& script); | |
| 227 bool evaluateDotParam(const char*& script, const char* field, size_t fie
ldLength); | |
| 228 bool functionParams(const char** scriptPtr, SkTDArray<SkScriptValue2>* p
arams); | |
| 229 size_t getTokenOffset(); | |
| 230 SkOperand2::OpType getUnboxType(SkOperand2 scriptValue); | |
| 231 bool handleArrayIndexer(const char** scriptPtr); | |
| 232 bool handleFunction(const char** scriptPtr); | |
| 233 bool handleMember(const char* field, size_t len, void* object); | |
| 234 bool handleMemberFunction(const char* field, size_t len, void* object, | |
| 235 SkTDArray<SkScriptValue2>* params); | |
| 236 bool handleProperty(); | |
| 237 bool handleUnbox(SkScriptValue2* scriptValue); | |
| 238 bool innerScript(const char** scriptPtr, SkScriptValue2* value); | |
| 239 int logicalOp(char ch, char nextChar); | |
| 240 void processLogicalOp(Op op); | |
| 241 bool processOp(); | |
| 242 void resolveBranch(Branch& ); | |
| 243 // void setAnimateMaker(SkAnimateMaker* maker) { fMaker = maker; } | |
| 244 SkDynamicMemoryWStream fStream; | |
| 245 SkDynamicMemoryWStream* fActiveStream; | |
| 246 SkTDStack<BraceStyle> fBraceStack; // curly, square, functi
on paren | |
| 247 SkTDStack<Branch> fBranchStack; // logical operators, slot to store for
ward branch | |
| 248 SkLongArray(SkScriptCallBack*) fCallBackArray; | |
| 249 SkTDStack<Op> fOpStack; | |
| 250 SkTDStack<SkScriptValue2> fValueStack; | |
| 251 // SkAnimateMaker* fMaker; | |
| 252 SkLongArray(SkOpArray*) fTrackArray; | |
| 253 SkTDStringArray fTrackString; | |
| 254 const char* fToken; // one-deep stack | |
| 255 size_t fTokenLength; | |
| 256 SkOperand2::OpType fReturnType; | |
| 257 Error fError; | |
| 258 SkOperand2::OpType fAccumulatorType; // tracking for code generation | |
| 259 SkBool fBranchPopAllowed; | |
| 260 SkBool fConstExpression; | |
| 261 SkBool fOperandInUse; | |
| 262 private: | |
| 263 #ifdef SK_DEBUG | |
| 264 public: | |
| 265 void decompile(const unsigned char* , size_t ); | |
| 266 static void UnitTest(); | |
| 267 static void ValidateDecompileTable(); | |
| 268 #endif | |
| 269 }; | |
| 270 | |
| 271 #ifdef SK_DEBUG | |
| 272 | |
| 273 struct SkScriptNAnswer2 { | |
| 274 const char* fScript; | |
| 275 SkOperand2::OpType fType; | |
| 276 int32_t fIntAnswer; | |
| 277 SkScalar fScalarAnswer; | |
| 278 const char* fStringAnswer; | |
| 279 }; | |
| 280 | |
| 281 #endif | |
| 282 | |
| 283 | |
| 284 #endif // SkScript2_DEFINED | |
| 285 | |
| OLD | NEW |