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