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