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