1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com 2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/* 3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2011 Google Inc. 4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * 5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be 6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file. 7ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com */ 88a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#ifndef SkScript2_DEFINED 98a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define SkScript2_DEFINED 108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkOperand2.h" 128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkStream.h" 138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkTDArray.h" 148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkTDArray_Experimental.h" 158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkTDict.h" 168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkTDStack.h" 178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 18d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.comtypedef SkLongArray(SkString*) SkTDStringArray; 198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comclass SkAnimateMaker; 218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comclass SkScriptCallBack; 228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 238a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comclass SkScriptEngine2 { 248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.compublic: 25d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com enum Error { 26d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com kNoError, 27d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com kArrayIndexOutOfBounds, 28d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com kCouldNotFindReferencedID, 29d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com kFunctionCallFailed, 30d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com kMemberOpFailed, 31d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com kPropertyOpFailed 32d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com }; 338a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 34d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com enum Attrs { 35d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com kConstant, 36d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com kVariable 37d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com }; 388a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 39d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com SkScriptEngine2(SkOperand2::OpType returnType); 40d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com ~SkScriptEngine2(); 41d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com bool convertTo(SkOperand2::OpType , SkScriptValue2* ); 42d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com bool evaluateScript(const char** script, SkScriptValue2* value); 43d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com void forget(SkOpArray* array); 44d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com Error getError() { return fError; } 45d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com SkOperand2::OpType getReturnType() { return fReturnType; } 46d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com void track(SkOpArray* array) { 47d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com SkASSERT(fTrackArray.find(array) < 0); 48d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com *fTrackArray.append() = array; } 49d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com void track(SkString* string) { 50d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com SkASSERT(fTrackString.find(string) < 0); 51d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com *fTrackString.append() = string; 52d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com } 53d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com static bool ConvertTo(SkScriptEngine2* , SkOperand2::OpType toType, SkScriptValue2* value); 54d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com static SkScalar IntToScalar(int32_t ); 55d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com static bool ValueToString(const SkScriptValue2& value, SkString* string); 568a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 57d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com enum Op { // used by tokenizer attribute table 58d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com kUnassigned, 59d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com kAdd, 60d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com kBitAnd, 61d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com kBitNot, 62d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com kBitOr, 63d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com kDivide, 64d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com kEqual, 65d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com kFlipOps, 66d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com kGreaterEqual, 67d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com kLogicalAnd, 68d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com kLogicalNot, 69d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com kLogicalOr, 70d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com kMinus, 71d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com kModulo, 72d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com kMultiply, 73d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com kShiftLeft, 74d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com kShiftRight, // signed 75d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com kSubtract, 76d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com kXor, 778a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com// following not in attribute table 78d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com kArrayOp, 79d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com kElse, 80d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com kIf, 81d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com kParen, 82d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com kLastLogicalOp, 83d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com kArtificialOp = 0x20 84d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com }; 858a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 86d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com enum TypeOp { // generated by tokenizer 87d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com kNop, // should never get generated 88d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com kAccumulatorPop, 89d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com kAccumulatorPush, 90d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com kAddInt, 91d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com kAddScalar, 92d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com kAddString, // string concat 93d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com kArrayIndex, 94d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com kArrayParam, 95d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com kArrayToken, 96d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com kBitAndInt, 97d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com kBitNotInt, 98d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com kBitOrInt, 99d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com kBoxToken, 100d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com kCallback, 101d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com kDivideInt, 102d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com kDivideScalar, 103d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com kDotOperator, 104d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com kElseOp, 105d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com kEnd, 106d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com kEqualInt, 107d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com kEqualScalar, 108d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com kEqualString, 109d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com kFunctionCall, 110d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com kFlipOpsOp, 111d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com kFunctionToken, 112d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com kGreaterEqualInt, 113d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com kGreaterEqualScalar, 114d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com kGreaterEqualString, 115d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com kIfOp, 116d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com kIntToScalar, 117d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com kIntToScalar2, 118d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com kIntToString, 119d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com kIntToString2, 120d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com kIntegerAccumulator, 121d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com kIntegerOperand, 122d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com kLogicalAndInt, 123d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com kLogicalNotInt, 124d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com kLogicalOrInt, 125d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com kMemberOp, 126d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com kMinusInt, 127d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com kMinusScalar, 128d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com kModuloInt, 129d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com kModuloScalar, 130d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com kMultiplyInt, 131d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com kMultiplyScalar, 132d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com kPropertyOp, 133d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com kScalarAccumulator, 134d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com kScalarOperand, 135d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com kScalarToInt, 136d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com kScalarToInt2, 137d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com kScalarToString, 138d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com kScalarToString2, 139d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com kShiftLeftInt, 140d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com kShiftRightInt, // signed 141d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com kStringAccumulator, 142d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com kStringOperand, 143d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com kStringToInt, 144d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com kStringToScalar, 145d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com kStringToScalar2, 146d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com kStringTrack, 147d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com kSubtractInt, 148d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com kSubtractScalar, 149d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com kToBool, 150d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com kUnboxToken, 151d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com kUnboxToken2, 152d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com kXorInt, 153d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com kLastTypeOp 154d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com }; 1558a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 156d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com enum OpBias { 157d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com kNoBias, 158d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com kTowardsNumber = 0, 159d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com kTowardsString 160d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com }; 1618a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1628a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comprotected: 1638a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 164d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com enum BraceStyle { 165d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com // kStructBrace, 166d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com kArrayBrace, 167d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com kFunctionBrace 168d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com }; 1698a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 170d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com enum AddTokenRegister { 171d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com kAccumulator, 172d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com kOperand 173d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com }; 1748a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 175d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com enum ResultIsBoolean { 176d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com kResultIsNotBoolean, 177d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com kResultIsBoolean 178d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com }; 1798a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 180d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com struct OperatorAttributes { 181d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com unsigned int fLeftType : 3; // SkOpType union, but only lower values 182d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com unsigned int fRightType : 3; // SkOpType union, but only lower values 183d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com OpBias fBias : 1; 184d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com ResultIsBoolean fResultIsBoolean : 1; 185d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com }; 1868a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 187d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com struct Branch { 188d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com Branch() { 189d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com } 1908a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 19192f93264e760b74cc706d01b2d0fcfaa3d857f51commit-bot@chromium.org Branch(Op op, int depth, size_t offset) 19292f93264e760b74cc706d01b2d0fcfaa3d857f51commit-bot@chromium.org : fOffset(SkToU16(offset)), fOpStackDepth(depth), fOperator(op) 19392f93264e760b74cc706d01b2d0fcfaa3d857f51commit-bot@chromium.org , fPrimed(kIsNotPrimed), fDone(kIsNotDone) { 194d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com } 1958a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 196d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com enum Primed { 197d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com kIsNotPrimed, 198d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com kIsPrimed 199d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com }; 200d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 201d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com enum Done { 202d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com kIsNotDone, 203d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com kIsDone, 204d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com }; 205d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 206d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com unsigned fOffset : 16; // offset in generated stream where branch needs to go 207d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com int fOpStackDepth : 7; // depth when operator was found 208d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com Op fOperator : 6; // operand which generated branch 209d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com mutable Primed fPrimed : 1; // mark when next instruction generates branch 210d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com Done fDone : 1; // mark when branch is complete 211d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com void prime() { fPrimed = kIsPrimed; } 212d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com void resolve(SkDynamicMemoryWStream* , size_t offset); 213d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com }; 214d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 215d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com static const OperatorAttributes gOpAttributes[]; 216d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com static const signed char gPrecedence[]; 217d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com static const TypeOp gTokens[]; 218d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com void addToken(TypeOp ); 219d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com void addTokenConst(SkScriptValue2* , AddTokenRegister , SkOperand2::OpType , TypeOp ); 220d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com void addTokenInt(int ); 221d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com void addTokenScalar(SkScalar ); 222d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com void addTokenString(const SkString& ); 223d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com void addTokenValue(const SkScriptValue2& , AddTokenRegister ); 224d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com int arithmeticOp(char ch, char nextChar, bool lastPush); 225d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com bool convertParams(SkTDArray<SkScriptValue2>* , 226d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com const SkOperand2::OpType* paramTypes, int paramTypeCount); 227d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com void convertToString(SkOperand2* operand, SkOperand2::OpType type) { 228d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com SkScriptValue2 scriptValue; 229d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com scriptValue.fOperand = *operand; 230d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com scriptValue.fType = type; 231d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com convertTo(SkOperand2::kString, &scriptValue); 232d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com *operand = scriptValue.fOperand; 233d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com } 234d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com bool evaluateDot(const char*& script); 235d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com bool evaluateDotParam(const char*& script, const char* field, size_t fieldLength); 236d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com bool functionParams(const char** scriptPtr, SkTDArray<SkScriptValue2>* params); 237d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com size_t getTokenOffset(); 238d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com SkOperand2::OpType getUnboxType(SkOperand2 scriptValue); 239d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com bool handleArrayIndexer(const char** scriptPtr); 240d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com bool handleFunction(const char** scriptPtr); 241d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com bool handleMember(const char* field, size_t len, void* object); 242d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com bool handleMemberFunction(const char* field, size_t len, void* object, 243d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com SkTDArray<SkScriptValue2>* params); 244d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com bool handleProperty(); 245d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com bool handleUnbox(SkScriptValue2* scriptValue); 246d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com bool innerScript(const char** scriptPtr, SkScriptValue2* value); 247d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com int logicalOp(char ch, char nextChar); 248d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com void processLogicalOp(Op op); 249d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com bool processOp(); 250d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com void resolveBranch(Branch& ); 251d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com// void setAnimateMaker(SkAnimateMaker* maker) { fMaker = maker; } 252d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com SkDynamicMemoryWStream fStream; 253d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com SkDynamicMemoryWStream* fActiveStream; 254d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com SkTDStack<BraceStyle> fBraceStack; // curly, square, function paren 255d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com SkTDStack<Branch> fBranchStack; // logical operators, slot to store forward branch 256d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com SkLongArray(SkScriptCallBack*) fCallBackArray; 257d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com SkTDStack<Op> fOpStack; 258d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com SkTDStack<SkScriptValue2> fValueStack; 259d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com// SkAnimateMaker* fMaker; 260d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com SkLongArray(SkOpArray*) fTrackArray; 261d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com SkTDStringArray fTrackString; 262d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com const char* fToken; // one-deep stack 263d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com size_t fTokenLength; 264d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com SkOperand2::OpType fReturnType; 265d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com Error fError; 266d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com SkOperand2::OpType fAccumulatorType; // tracking for code generation 267d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com SkBool fBranchPopAllowed; 268d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com SkBool fConstExpression; 269d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com SkBool fOperandInUse; 2708a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comprivate: 2718a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#ifdef SK_DEBUG 2728a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.compublic: 273d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com void decompile(const unsigned char* , size_t ); 274d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com static void UnitTest(); 275d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com static void ValidateDecompileTable(); 2768a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif 2778a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}; 2788a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 2798a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#ifdef SK_DEBUG 2808a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 2818a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstruct SkScriptNAnswer2 { 282d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com const char* fScript; 283d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com SkOperand2::OpType fType; 284d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com int32_t fIntAnswer; 285d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com SkScalar fScalarAnswer; 286d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com const char* fStringAnswer; 2878a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}; 2888a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 2898a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif 2908a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 2918a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 2928a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif // SkScript2_DEFINED 293