18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* 28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 1999-2000 Harri Porten (porten@kde.org) 3635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * Copyright (C) 2004, 2005, 2006, 2007, 2008 Apple Inc. All rights reserved. 48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * This library is free software; you can redistribute it and/or 68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modify it under the terms of the GNU Library General Public 78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * License as published by the Free Software Foundation; either 88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * version 2 of the License, or (at your option) any later version. 98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * This library is distributed in the hope that it will be useful, 118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * but WITHOUT ANY WARRANTY; without even the implied warranty of 128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Library General Public License for more details. 148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * You should have received a copy of the GNU Library General Public License 168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * along with this library; see the file COPYING.LIB. If not, write to 178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Boston, MA 02110-1301, USA. 198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */ 218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "config.h" 228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2353733164eb6cabab5a1eddcabb42e4ce27eb0e44Ben Murdoch#include "BridgeJSC.h" 248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "JSObject.h" 251325a8463a7f9bc2ec969c7728aba33e3de91a17Steve Block#include "JSValue.h" 268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "interpreter.h" 278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "npruntime_internal.h" 288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "runtime_object.h" 291325a8463a7f9bc2ec969c7728aba33e3de91a17Steve Block#include "types.h" 301325a8463a7f9bc2ec969c7728aba33e3de91a17Steve Block#include <assert.h> 311325a8463a7f9bc2ec969c7728aba33e3de91a17Steve Block#include <stdio.h> 321325a8463a7f9bc2ec969c7728aba33e3de91a17Steve Block#include <string.h> 338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define LOG(formatAndArgs...) { \ 368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project fprintf (stderr, "%s: ", __PRETTY_FUNCTION__); \ 378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project fprintf(stderr, formatAndArgs); \ 388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// ------------------ NP Interface definition -------------------- 428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projecttypedef struct 438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NPObject object; 458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project double doubleValue; 468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project int intValue; 478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NPVariant stringValue; 488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bool boolValue; 498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} MyObject; 508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic bool identifiersInitialized = false; 538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define ID_DOUBLE_VALUE 0 558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define ID_INT_VALUE 1 568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define ID_STRING_VALUE 2 578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define ID_BOOLEAN_VALUE 3 588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define ID_NULL_VALUE 4 598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define ID_UNDEFINED_VALUE 5 608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define NUM_PROPERTY_IDENTIFIERS 6 618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic NPIdentifier myPropertyIdentifiers[NUM_PROPERTY_IDENTIFIERS]; 638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic const NPUTF8 *myPropertyIdentifierNames[NUM_PROPERTY_IDENTIFIERS] = { 648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project "doubleValue", 658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project "intValue", 668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project "stringValue", 678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project "booleanValue", 688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project "nullValue", 698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project "undefinedValue" 708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}; 718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define ID_LOG_MESSAGE 0 738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define ID_SET_DOUBLE_VALUE 1 748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define ID_SET_INT_VALUE 2 758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define ID_SET_STRING_VALUE 3 768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define ID_SET_BOOLEAN_VALUE 4 778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define ID_GET_DOUBLE_VALUE 5 788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define ID_GET_INT_VALUE 6 798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define ID_GET_STRING_VALUE 7 808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define ID_GET_BOOLEAN_VALUE 8 818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define NUM_METHOD_IDENTIFIERS 9 828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic NPIdentifier myMethodIdentifiers[NUM_METHOD_IDENTIFIERS]; 848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic const NPUTF8 *myMethodIdentifierNames[NUM_METHOD_IDENTIFIERS] = { 858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project "logMessage", 868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project "setDoubleValue", 878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project "setIntValue", 888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project "setStringValue", 898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project "setBooleanValue", 908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project "getDoubleValue", 918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project "getIntValue", 928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project "getStringValue", 938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project "getBooleanValue" 948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}; 958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void initializeIdentifiers() 978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NPN_GetStringIdentifiers (myPropertyIdentifierNames, NUM_PROPERTY_IDENTIFIERS, myPropertyIdentifiers); 998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NPN_GetStringIdentifiers (myMethodIdentifierNames, NUM_METHOD_IDENTIFIERS, myMethodIdentifiers); 1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}; 1018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool myHasProperty (NPClass *theClass, NPIdentifier name) 1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project int i; 1058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (i = 0; i < NUM_PROPERTY_IDENTIFIERS; i++) { 1068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (name == myPropertyIdentifiers[i]){ 1078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return true; 1088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 1118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool myHasMethod (NPClass *theClass, NPIdentifier name) 1148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project int i; 1168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (i = 0; i < NUM_METHOD_IDENTIFIERS; i++) { 1178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (name == myMethodIdentifiers[i]){ 1188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return true; 1198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 1228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid logMessage (const NPVariant *message) 1268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (message->type == NPVariantStringType) { 1288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project char msgBuf[1024]; 1298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project strncpy (msgBuf, message->value.stringValue.UTF8Characters, message->value.stringValue.UTF8Length); 1308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project msgBuf[message->value.stringValue.UTF8Length] = 0; 1318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project printf ("%s\n", msgBuf); 1328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else if (message->type == NPVariantDoubleType) 1348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project printf ("%f\n", (float)message->value.doubleValue); 1358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else if (message->type == NPVariantInt32Type) 1368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project printf ("%d\n", message->value.intValue); 1378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else if (message->type == NPVariantObjectType) 1388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project printf ("%p\n", message->value.objectValue); 1398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid setDoubleValue (MyObject *obj, const NPVariant *variant) 1428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!NPN_VariantToDouble (variant, &obj->doubleValue)) { 1448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NPUTF8 *msg = "Attempt to set double value with invalid type."; 1458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NPString aString; 1468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project aString.UTF8Characters = msg; 1478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project aString.UTF8Length = strlen (msg); 1488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NPN_SetException ((NPObject *)obj, &aString); 1498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid setIntValue (MyObject *obj, const NPVariant *variant) 1538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!NPN_VariantToInt32 (variant, &obj->intValue)) { 1558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NPUTF8 *msg = "Attempt to set int value with invalid type."; 1568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NPString aString; 1578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project aString.UTF8Characters = msg; 1588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project aString.UTF8Length = strlen (msg); 1598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NPN_SetException ((NPObject *)obj, &aString); 1608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid setStringValue (MyObject *obj, const NPVariant *variant) 1648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NPN_ReleaseVariantValue (&obj->stringValue); 1668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NPN_InitializeVariantWithVariant (&obj->stringValue, variant); 1678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid setBooleanValue (MyObject *obj, const NPVariant *variant) 1708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!NPN_VariantToBool (variant, (NPBool *)&obj->boolValue)) { 1728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NPUTF8 *msg = "Attempt to set bool value with invalid type."; 1738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NPString aString; 1748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project aString.UTF8Characters = msg; 1758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project aString.UTF8Length = strlen (msg); 1768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NPN_SetException ((NPObject *)obj, &aString); 1778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid getDoubleValue (MyObject *obj, NPVariant *variant) 1818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NPN_InitializeVariantWithDouble (variant, obj->doubleValue); 1838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid getIntValue (MyObject *obj, NPVariant *variant) 1868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NPN_InitializeVariantWithInt32 (variant, obj->intValue); 1888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid getStringValue (MyObject *obj, NPVariant *variant) 1918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NPN_InitializeVariantWithVariant (variant, &obj->stringValue); 1938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid getBooleanValue (MyObject *obj, NPVariant *variant) 1968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NPN_InitializeVariantWithBool (variant, obj->boolValue); 1988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid myGetProperty (MyObject *obj, NPIdentifier name, NPVariant *variant) 2018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (name == myPropertyIdentifiers[ID_DOUBLE_VALUE]){ 2038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project getDoubleValue (obj, variant); 2048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 2058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else if (name == myPropertyIdentifiers[ID_INT_VALUE]){ 2068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project getIntValue (obj, variant); 2078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 2088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else if (name == myPropertyIdentifiers[ID_STRING_VALUE]){ 2098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project getStringValue (obj, variant); 2108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 2118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else if (name == myPropertyIdentifiers[ID_BOOLEAN_VALUE]){ 2128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project getBooleanValue (obj, variant); 2138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 2148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else if (name == myPropertyIdentifiers[ID_NULL_VALUE]){ 2158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return NPN_InitializeVariantAsNull (variant); 2168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 2178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else if (name == myPropertyIdentifiers[ID_UNDEFINED_VALUE]){ 2188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return NPN_InitializeVariantAsUndefined (variant); 2198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 2208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else 2218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NPN_InitializeVariantAsUndefined(variant); 2228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid mySetProperty (MyObject *obj, NPIdentifier name, const NPVariant *variant) 2258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (name == myPropertyIdentifiers[ID_DOUBLE_VALUE]) { 2278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project setDoubleValue (obj, variant); 2288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 2298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else if (name == myPropertyIdentifiers[ID_INT_VALUE]) { 2308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project setIntValue (obj, variant); 2318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 2328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else if (name == myPropertyIdentifiers[ID_STRING_VALUE]) { 2338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project setStringValue (obj, variant); 2348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 2358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else if (name == myPropertyIdentifiers[ID_BOOLEAN_VALUE]) { 2368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project setBooleanValue (obj, variant); 2378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 2388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else if (name == myPropertyIdentifiers[ID_NULL_VALUE]) { 2398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Do nothing! 2408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 2418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else if (name == myPropertyIdentifiers[ID_UNDEFINED_VALUE]) { 2428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Do nothing! 2438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 2448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid myInvoke (MyObject *obj, NPIdentifier name, NPVariant *args, unsigned argCount, NPVariant *result) 2478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (name == myMethodIdentifiers[ID_LOG_MESSAGE]) { 2498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (argCount == 1 && NPN_VariantIsString(&args[0])) 2508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project logMessage (&args[0]); 2518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NPN_InitializeVariantAsVoid (result); 2528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 2538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else if (name == myMethodIdentifiers[ID_SET_DOUBLE_VALUE]) { 2548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (argCount == 1 && NPN_VariantIsDouble (&args[0])) 2558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project setDoubleValue (obj, &args[0]); 2568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NPN_InitializeVariantAsVoid (result); 2578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 2588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else if (name == myMethodIdentifiers[ID_SET_INT_VALUE]) { 2598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (argCount == 1 && (NPN_VariantIsDouble (&args[0]) || NPN_VariantIsInt32 (&args[0]))) 2608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project setIntValue (obj, &args[0]); 2618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NPN_InitializeVariantAsVoid (result); 2628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 2638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else if (name == myMethodIdentifiers[ID_SET_STRING_VALUE]) { 2648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (argCount == 1 && NPN_VariantIsString (&args[0])) 2658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project setStringValue (obj, &args[0]); 2668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NPN_InitializeVariantAsVoid (result); 2678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 2688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else if (name == myMethodIdentifiers[ID_SET_BOOLEAN_VALUE]) { 2698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (argCount == 1 && NPN_VariantIsBool (&args[0])) 2708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project setBooleanValue (obj, &args[0]); 2718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NPN_InitializeVariantAsVoid (result); 2728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 2738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else if (name == myMethodIdentifiers[ID_GET_DOUBLE_VALUE]) { 2748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project getDoubleValue (obj, result); 2758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 2768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else if (name == myMethodIdentifiers[ID_GET_INT_VALUE]) { 2778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project getIntValue (obj, result); 2788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 2798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else if (name == myMethodIdentifiers[ID_GET_STRING_VALUE]) { 2808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project getStringValue (obj, result); 2818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 2828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else if (name == myMethodIdentifiers[ID_GET_BOOLEAN_VALUE]) { 2838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project getBooleanValue (obj, result); 2848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 2858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else 2868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NPN_InitializeVariantAsUndefined (result); 2878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectNPObject *myAllocate () 2908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project MyObject *newInstance = (MyObject *)malloc (sizeof(MyObject)); 2928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!identifiersInitialized) { 2948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project identifiersInitialized = true; 2958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project initializeIdentifiers(); 2968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 2978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project newInstance->doubleValue = 666.666; 3008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project newInstance->intValue = 1234; 3018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project newInstance->boolValue = true; 3028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project newInstance->stringValue.type = NPVariantType_String; 3038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project newInstance->stringValue.value.stringValue.UTF8Length = strlen ("Hello world"); 3048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project newInstance->stringValue.value.stringValue.UTF8Characters = strdup ("Hello world"); 3058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return (NPObject *)newInstance; 3078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid myInvalidate () 3108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 3118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Make sure we've released any remaining references to JavaScript objects. 3128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid myDeallocate (MyObject *obj) 3158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 3168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project free ((void *)obj); 3178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic NPClass _myFunctionPtrs = { 3208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project kNPClassStructVersionCurrent, 3218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project (NPAllocateFunctionPtr) myAllocate, 3228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project (NPDeallocateFunctionPtr) myDeallocate, 3238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project (NPInvalidateFunctionPtr) myInvalidate, 3248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project (NPHasMethodFunctionPtr) myHasMethod, 3258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project (NPInvokeFunctionPtr) myInvoke, 3268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project (NPHasPropertyFunctionPtr) myHasProperty, 3278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project (NPGetPropertyFunctionPtr) myGetProperty, 3288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project (NPSetPropertyFunctionPtr) mySetProperty, 3298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}; 3308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic NPClass *myFunctionPtrs = &_myFunctionPtrs; 3318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// -------------------------------------------------------- 3338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectusing namespace JSC; 3358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectusing namespace JSC::Bindings; 3368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectclass GlobalImp : public ObjectImp { 3388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectpublic: 3398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project virtual UString className() const { return "global"; } 3408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}; 3418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define BufferSize 200000 3438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic char code[BufferSize]; 3448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectconst char *readJavaScriptFromFile (const char *file) 3468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 3478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project FILE *f = fopen(file, "r"); 3488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!f) { 3498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project fprintf(stderr, "Error opening %s.\n", file); 3508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 3518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project int num = fread(code, 1, BufferSize, f); 3548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project code[num] = '\0'; 3558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if(num >= BufferSize) 3568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project fprintf(stderr, "Warning: File may have been too long.\n"); 3578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project fclose(f); 3598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return code; 3618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectint main(int argc, char **argv) 3648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 3658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // expecting a filename 3668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (argc < 2) { 3678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project fprintf(stderr, "You have to specify at least one filename\n"); 3688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return -1; 3698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bool ret = true; 3728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 3738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project JSLock lock; 3748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // create interpreter w/ global object 3768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Object global(new GlobalImp()); 3778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Interpreter interp; 3788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project interp.setGlobalObject(global); 3798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ExecState *exec = interp.globalExec(); 3808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project MyObject *myObject = (MyObject *)NPN_CreateObject (myFunctionPtrs); 3828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project global.put(exec, Identifier("myInterface"), Instance::createRuntimeObject(Instance::CLanguage, (void *)myObject)); 3848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (int i = 1; i < argc; i++) { 3868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const char *code = readJavaScriptFromFile(argv[i]); 3878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (code) { 3898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // run 3908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Completion comp(interp.evaluate(code)); 3918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (comp.complType() == Throw) { 3938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Value exVal = comp.value(); 3948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project char *msg = exVal.toString(exec).ascii(); 3958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project int lineno = -1; 3968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (exVal.type() == ObjectType) { 3978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Value lineVal = Object::dynamicCast(exVal).get(exec,Identifier("line")); 3988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (lineVal.type() == NumberType) 3998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project lineno = int(lineVal.toNumber(exec)); 4008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 4018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (lineno != -1) 4028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project fprintf(stderr,"Exception, line %d: %s\n",lineno,msg); 4038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else 4048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project fprintf(stderr,"Exception: %s\n",msg); 4058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ret = false; 4068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 4078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else if (comp.complType() == ReturnValue) { 4088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project char *msg = comp.value().toString(interp.globalExec()).ascii(); 4098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project fprintf(stderr,"Return value: %s\n",msg); 4108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 4118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 4128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 4138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NPN_ReleaseObject ((NPObject *)myObject); 4158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } // end block, so that Interpreter and global get deleted 4178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return ret ? 0 : 3; 4198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 420