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