11cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 21cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger/* 31cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Copyright 2006 The Android Open Source Project 41cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * 51cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Use of this source code is governed by a BSD-style license that can be 61cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * found in the LICENSE file. 71cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger */ 81cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 90910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include <jsapi.h> 110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkJS.h" 130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#include "SkString.h" 140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifdef _WIN32_WCE 160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectextern "C" { 170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project void abort() { 180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkASSERT(0); 190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project unsigned int _control87(unsigned int _new, unsigned int mask ) { 220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkASSERT(0); 230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return 0; 240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project time_t mktime(struct tm *timeptr ) { 270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkASSERT(0); 280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return 0; 290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project// int errno; 320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project char *strdup(const char *) { 340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkASSERT(0); 350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return 0; 360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project char *strerror(int errnum) { 390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkASSERT(0); 400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return 0; 410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project int isatty(void* fd) { 440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkASSERT(0); 450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return 0; 460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project int putenv(const char *envstring) { 490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkASSERT(0); 500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return 0; 510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project char *getenv(const char *varname) { 540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkASSERT(0); 550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return 0; 560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project void GetSystemTimeAsFileTime(LPFILETIME lpSystemTimeAsFileTime) { 590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkASSERT(0); 600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project struct tm * localtime(const time_t *timer) { 630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkASSERT(0); 640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return 0; 650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project size_t strftime(char *strDest, size_t maxsize, const char *format, 680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const struct tm *timeptr ) { 690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkASSERT(0); 700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return 0; 710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif 750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectstatic JSBool 770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectglobal_enumerate(JSContext *cx, JSObject *obj) 780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project{ 790910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifdef LAZY_STANDARD_CLASSES 800910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return JS_EnumerateStandardClasses(cx, obj); 810910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#else 820910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return JS_TRUE; 830910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif 840910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 850910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 860910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectstatic JSBool 870910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectglobal_resolve(JSContext *cx, JSObject *obj, jsval id, uintN flags, JSObject **objp) 880910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project{ 890910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifdef LAZY_STANDARD_CLASSES 900910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if ((flags & JSRESOLVE_ASSIGNING) == 0) { 910910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project JSBool resolved; 920910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 930910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (!JS_ResolveStandardClass(cx, obj, id, &resolved)) 940910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return JS_FALSE; 950910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (resolved) { 960910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project *objp = obj; 970910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return JS_TRUE; 980910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 990910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 1000910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif 1010910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1020910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#if defined(SHELL_HACK) && defined(DEBUG) && defined(XP_UNIX) 1030910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if ((flags & (JSRESOLVE_QUALIFIED | JSRESOLVE_ASSIGNING)) == 0) { 1040910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project /* 1050910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project * Do this expensive hack only for unoptimized Unix builds, which are 1060910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project * not used for benchmarking. 1070910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project */ 1080910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project char *path, *comp, *full; 1090910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project const char *name; 1100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project JSBool ok, found; 1110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project JSFunction *fun; 1120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (!JSVAL_IS_STRING(id)) 1140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return JS_TRUE; 1150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project path = getenv("PATH"); 1160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (!path) 1170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return JS_TRUE; 1180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project path = JS_strdup(cx, path); 1190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (!path) 1200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return JS_FALSE; 1210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project name = JS_GetStringBytes(JSVAL_TO_STRING(id)); 1220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project ok = JS_TRUE; 1230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project for (comp = strtok(path, ":"); comp; comp = strtok(NULL, ":")) { 1240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (*comp != '\0') { 1250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project full = JS_smprintf("%s/%s", comp, name); 1260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (!full) { 1270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project JS_ReportOutOfMemory(cx); 1280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project ok = JS_FALSE; 1290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project break; 1300910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 1310910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } else { 1320910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project full = (char *)name; 1330910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 1340910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project found = (access(full, X_OK) == 0); 1350910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (*comp != '\0') 1360910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project free(full); 1370910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (found) { 1380910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project fun = JS_DefineFunction(cx, obj, name, Exec, 0, JSPROP_ENUMERATE); 1390910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project ok = (fun != NULL); 1400910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (ok) 1410910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project *objp = obj; 1420910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project break; 1430910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 1440910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 1450910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project JS_free(cx, path); 1460910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return ok; 1470910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 1480910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#else 1490910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return JS_TRUE; 1500910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endif 1510910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 1520910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1530910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectJSClass global_class = { 1540910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project "global", JSCLASS_NEW_RESOLVE, 1550910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project JS_PropertyStub, JS_PropertyStub, 1560910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project JS_PropertyStub, JS_PropertyStub, 1570910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project global_enumerate, (JSResolveOp) global_resolve, 1580910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project JS_ConvertStub, JS_FinalizeStub 1590910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project}; 1600910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1610910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectSkJS::SkJS(void* hwnd) : SkOSWindow(hwnd) { 1620910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if ((fRuntime = JS_NewRuntime(0x100000)) == NULL) { 1630910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkASSERT(0); 1640910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return; 1650910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 1660910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if ((fContext = JS_NewContext(fRuntime, 0x1000)) == NULL) { 1670910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkASSERT(0); 1680910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return; 1690910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 1700910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project ; 1710910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if ((fGlobal = JS_NewObject(fContext, &global_class, NULL, NULL)) == NULL) { 1720910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkASSERT(0); 1730910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return; 1740910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 1750910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (JS_InitStandardClasses(fContext, fGlobal) == NULL) { 1760910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkASSERT(0); 1770910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return; 1780910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project } 1790910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project setConfig(SkBitmap::kARGB32_Config); 1800910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project updateSize(); 1810910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project setVisibleP(true); 1820910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project InitializeDisplayables(getBitmap(), fContext, fGlobal, NULL); 1830910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 1840910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1850910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectSkJS::~SkJS() { 1860910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project DisposeDisplayables(); 1870910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project JS_DestroyContext(fContext); 1880910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project JS_DestroyRuntime(fRuntime); 1890910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project JS_ShutDown(); 1900910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 1910910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1920910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectSkBool SkJS::EvaluateScript(const char* script, jsval* rVal) { 1930910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return JS_EvaluateScript(fContext, fGlobal, script, strlen(script), 1940910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project "memory" /* no file name */, 0 /* no line number */, rVal); 1950910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 1960910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 1970910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source ProjectSkBool SkJS::ValueToString(jsval value, SkString* string) { 1980910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project JSString* str = JS_ValueToString(fContext, value); 1990910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project if (str == NULL) 2000910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return false; 2010910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project string->set(JS_GetStringBytes(str)); 2020910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project return true; 2030910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 2040910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 2050910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#ifdef SK_DEBUG 2060910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Projectvoid SkJS::Test(void* hwnd) { 2070910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkJS js(hwnd); 2080910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project jsval val; 2090910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkBool success = js.EvaluateScript("22/7", &val); 2100910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkASSERT(success); 2110910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkString string; 2120910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project success = js.ValueToString(val, &string); 2130910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkASSERT(success); 2140910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkASSERT(strcmp(string.c_str(), "3.142857142857143") == 0); 2150910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project success = js.EvaluateScript( 2160910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project "var rect = new rectangle();" 2170910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project "rect.left = 4;" 2180910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project "rect.top = 10;" 2190910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project "rect.right = 20;" 2200910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project "rect.bottom = 30;" 2210910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project "rect.width = rect.height + 20;" 2220910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project "rect.draw();" 2230910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project , &val); 2240910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkASSERT(success); 2250910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project success = js.ValueToString(val, &string); 2260910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project SkASSERT(success); 2270910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project} 2280910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project#endifASSERT(success); 2290910916c0f7b951ee55c4b7c6358295b9bca0565The Android Open Source Project 230