Incrementals

git-svn-id: svn://10.0.0.236/trunk@126330 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
rogerl%netscape.com
2002-08-05 01:38:23 +00:00
parent 06a5b63da0
commit ca173c3c32
5 changed files with 259 additions and 101 deletions

View File

@@ -69,20 +69,21 @@ namespace JavaScript {
namespace MetaData {
JSRuntime *gMonkeyRuntime;
JSContext *gMonkeyContext;
JSObject *gMonkeyGlobalObject;
JSClass gMonkeyGlobalClass = { "MyClass", 0, JS_PropertyStub, JS_PropertyStub,
JS_PropertyStub, JS_PropertyStub, JS_EnumerateStub,
JS_ResolveStub, JS_ConvertStub, JS_FinalizeStub };
JSClass gMonkeyMultinameClass =
{ "Multiname", 0, JS_PropertyStub, JS_PropertyStub,
JS_PropertyStub, JS_PropertyStub, JS_EnumerateStub,
JS_ResolveStub, JS_ConvertStub, JS_FinalizeStub };
// forward ref.
// forward refs.
static void Multiname_finalize(JSContext *cx, JSObject *obj);
static void LexicalReference_finalize(JSContext *cx, JSObject *obj);
static void Namespace_finalize(JSContext *cx, JSObject *obj);
JSClass gMonkeyMultinameClass =
{ "Multiname", JSCLASS_HAS_PRIVATE,
JS_PropertyStub, JS_PropertyStub,
JS_PropertyStub, JS_PropertyStub, JS_EnumerateStub,
JS_ResolveStub, JS_ConvertStub, Multiname_finalize };
JSClass gMonkeyLexicalReferenceClass =
{ "LexicalReference", JSCLASS_HAS_PRIVATE,
@@ -90,6 +91,12 @@ namespace MetaData {
JS_PropertyStub, JS_PropertyStub, JS_EnumerateStub,
JS_ResolveStub, JS_ConvertStub, LexicalReference_finalize };
JSClass gMonkeyNamespaceClass =
{ "Namespace", JSCLASS_HAS_PRIVATE,
JS_PropertyStub, JS_PropertyStub,
JS_PropertyStub, JS_PropertyStub, JS_EnumerateStub,
JS_ResolveStub, JS_ConvertStub, Namespace_finalize };
// member functions at global scope
JSFunctionSpec jsfGlobal [] =
{
@@ -112,7 +119,7 @@ namespace MetaData {
static JSBool
LexicalReference_constructor(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
{
ExecutionState *eState = static_cast<ExecutionState *>(JS_GetContextPrivate(cx));
JS2Metadata *meta = static_cast<JS2Metadata *>(JS_GetContextPrivate(cx));
ASSERT(argc == 2);
ASSERT(JSVAL_IS_BOOLEAN(argv[0])); // the 'strict' flag (XXX what's that for?)
@@ -122,7 +129,7 @@ namespace MetaData {
ASSERT(OBJ_GET_CLASS(cx, multiNameObj) == &gMonkeyMultinameClass);
Multiname *mName = static_cast<Multiname *>(JS_GetPrivate(cx, multiNameObj));
if (!JS_SetPrivate(cx, obj, new LexicalReference(mName, eState->env, (JSVAL_TO_BOOLEAN(argv[0])) == JS_TRUE) ))
if (!JS_SetPrivate(cx, obj, new LexicalReference(mName, &meta->env, (JSVAL_TO_BOOLEAN(argv[0])) == JS_TRUE) ))
return JS_FALSE;
return JS_TRUE;
@@ -142,10 +149,10 @@ namespace MetaData {
readLexicalReference(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
{
ASSERT(OBJ_GET_CLASS(cx, obj) == &gMonkeyLexicalReferenceClass);
ExecutionState *eState = static_cast<ExecutionState *>(JS_GetContextPrivate(cx));
JS2Metadata *meta = static_cast<JS2Metadata *>(JS_GetContextPrivate(cx));
LexicalReference *lRef = static_cast<LexicalReference *>(JS_GetPrivate(cx, obj));
eState->env->lexicalRead(eState, lRef->variableMultiname, RunPhase);
meta->env.lexicalRead(meta, lRef->variableMultiname, RunPhase);
return JS_TRUE;
}
@@ -154,7 +161,7 @@ namespace MetaData {
writeLexicalReference(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
{
ASSERT(OBJ_GET_CLASS(cx, obj) == &gMonkeyLexicalReferenceClass);
ExecutionState *eState = static_cast<ExecutionState *>(JS_GetContextPrivate(cx));
JS2Metadata *meta = static_cast<JS2Metadata *>(JS_GetContextPrivate(cx));
LexicalReference *lRef = static_cast<LexicalReference *>(JS_GetPrivate(cx, obj));
@@ -179,35 +186,67 @@ namespace MetaData {
static JSBool
Multiname_constructor(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
{
JS2Metadata *meta = static_cast<JS2Metadata *>(JS_GetContextPrivate(cx));
ASSERT(argc >= 1); // could be just the base name
ASSERT(OBJ_GET_CLASS(cx, obj) == &gMonkeyMultinameClass);
ASSERT(JSVAL_IS_STRING(argv[0]));
JSString *str = JSVAL_TO_STRING(argv[0]);
// XXX use reserved slots instead
if (!JS_SetProperty(cx, obj, "name", &argv[0]))
Multiname *mName = new Multiname(meta->world.identifiers[String(JS_GetStringChars(str), JS_GetStringLength(str))]);
if (!JS_SetPrivate(cx, obj, mName))
return JS_FALSE;
jsval qualifierVal = JSVAL_NULL;
if (argc > 1) {
JSObject *qualArray = JS_NewArrayObject(cx, argc - 1, &argv[1]);
if (!qualArray)
return JS_FALSE;
qualifierVal = OBJECT_TO_JSVAL(qualArray);
for (uintN i = 1; i < argc; i++) {
ASSERT(JSVAL_IS_OBJECT(argv[i]));
JSObject *obj = JSVAL_TO_OBJECT(argv[i]);
ASSERT(OBJ_GET_CLASS(cx, obj) == &gMonkeyNamespaceClass);
Namespace *ns = static_cast<Namespace *>(JS_GetPrivate(cx, obj));
mName->addNamespace(ns);
}
if (!JS_SetProperty(cx, obj, "qualifiers", &qualifierVal))
return JS_FALSE;
return JS_TRUE;
}
// member functions in a Multiname
JSFunctionSpec jsfMultiname [] =
// finalize a Multiname - called by Monkey gc
static void
Multiname_finalize(JSContext *cx, JSObject *obj)
{
{ 0 }
};
ASSERT(OBJ_GET_CLASS(cx, obj) == &gMonkeyMultinameClass);
Multiname *mName = static_cast<Multiname *>(JS_GetPrivate(cx, obj));
if (mName) delete mName;
}
/******************************************************************************
Namespace
******************************************************************************/
// finish constructing a Namespace
static JSBool
Namespace_constructor(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
{
JS2Metadata *meta = static_cast<JS2Metadata *>(JS_GetContextPrivate(cx));
ASSERT(argc == 1);
ASSERT(JSVAL_IS_STRING(argv[0]));
JSString *str = JSVAL_TO_STRING(argv[0]);
Namespace *ns = new Namespace(meta->world.identifiers[String(JS_GetStringChars(str), JS_GetStringLength(str))]);
if (!JS_SetPrivate(cx, obj, ns))
return JS_FALSE;
return JS_TRUE;
}
// finalize a Namespace - called by Monkey gc
static void
Namespace_finalize(JSContext *cx, JSObject *obj)
{
ASSERT(OBJ_GET_CLASS(cx, obj) == &gMonkeyNamespaceClass);
Namespace *ns = static_cast<Namespace *>(JS_GetPrivate(cx, obj));
if (ns) delete ns;
}
@@ -216,45 +255,50 @@ namespace MetaData {
// Initialize the SpiderMonkey engine
void JS2Metadata::initializeMonkey()
{
gMonkeyRuntime = JS_NewRuntime( 1000000L );
if (!gMonkeyRuntime)
monkeyRuntime = JS_NewRuntime(1000000L);
if (!monkeyRuntime)
throw "Monkey start failure";
gMonkeyContext = JS_NewContext( gMonkeyRuntime, 8192 );
if (!gMonkeyContext)
monkeyContext = JS_NewContext(monkeyRuntime, 8192);
if (!monkeyContext)
throw "Monkey start failure";
gMonkeyGlobalObject = JS_NewObject(gMonkeyContext, &gMonkeyGlobalClass, NULL, NULL);
if (!gMonkeyGlobalObject)
monkeyGlobalObject = JS_NewObject(monkeyContext, &gMonkeyGlobalClass, NULL, NULL);
if (!monkeyGlobalObject)
throw "Monkey start failure";
JS_SetErrorReporter(gMonkeyContext, MonkeyError);
JS_SetErrorReporter(monkeyContext, MonkeyError);
JS_InitStandardClasses(gMonkeyContext, gMonkeyGlobalObject);
if (!JS_InitStandardClasses(monkeyContext, monkeyGlobalObject))
throw "Monkey start failure";
JS_InitClass(gMonkeyContext, gMonkeyGlobalObject, NULL,
JS_InitClass(monkeyContext, monkeyGlobalObject, NULL,
&gMonkeyLexicalReferenceClass, LexicalReference_constructor, 0,
NULL, jsfLexicalReference, NULL, NULL);
JS_InitClass(gMonkeyContext, gMonkeyGlobalObject, NULL,
JS_InitClass(monkeyContext, monkeyGlobalObject, NULL,
&gMonkeyMultinameClass, Multiname_constructor, 0,
NULL, jsfMultiname, NULL, NULL);
NULL, NULL, NULL, NULL);
JS_DefineFunctions(gMonkeyContext, gMonkeyGlobalObject, jsfGlobal);
JS_InitClass(monkeyContext, monkeyGlobalObject, NULL,
&gMonkeyNamespaceClass, Namespace_constructor, 0,
NULL, NULL, NULL, NULL);
if (!JS_DefineFunctions(monkeyContext, monkeyGlobalObject, jsfGlobal))
throw "Monkey start failure";
}
// Execute a JS string against the given environment
// Errors are thrown back to C++ by the error handler
jsval JS2Metadata::execute(String *str, Environment *env, JS2Metadata *meta, size_t pos)
jsval JS2Metadata::execute(String *str, size_t pos)
{
jsval retval;
ExecutionState eState(gMonkeyContext, env, meta, pos);
JS_SetContextPrivate(gMonkeyContext, &eState);
errorPos = pos;
JS_SetContextPrivate(monkeyContext, this);
JS_EvaluateUCScript(gMonkeyContext, gMonkeyGlobalObject, str->c_str(), str->length(), "file", 1, &retval);
JS_EvaluateUCScript(monkeyContext, monkeyGlobalObject, str->c_str(), str->length(), "file", 1, &retval);
return retval;
}