Changeset 14834 in webkit for trunk/JavaScriptCore/kjs/internal.cpp
- Timestamp:
- Jun 12, 2006, 11:08:52 PM (19 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/JavaScriptCore/kjs/internal.cpp
r14799 r14834 188 188 } 189 189 190 // ------------------------------ InterpreterImp -------------------------------191 192 InterpreterImp* InterpreterImp::s_hook = 0L;193 194 typedef HashMap<JSObject *, InterpreterImp *> InterpreterMap;195 196 static inline InterpreterMap &interpreterMap()197 {198 static InterpreterMap *map = new InterpreterMap;199 return *map;200 }201 202 InterpreterImp::InterpreterImp(Interpreter *interp, JSObject *glob)203 : globExec(interp, 0)204 , _context(0)205 {206 // add this interpreter to the global chain207 // as a root set for garbage collection208 JSLock lock;209 210 m_interpreter = interp;211 if (s_hook) {212 prev = s_hook;213 next = s_hook->next;214 s_hook->next->prev = this;215 s_hook->next = this;216 } else {217 // This is the first interpreter218 s_hook = next = prev = this;219 }220 221 interpreterMap().set(glob, this);222 223 global = glob;224 dbg = 0;225 m_compatMode = Interpreter::NativeMode;226 227 // initialize properties of the global object228 initGlobalObject();229 230 recursion = 0;231 }232 233 void InterpreterImp::initGlobalObject()234 {235 Identifier::init();236 237 // Contructor prototype objects (Object.prototype, Array.prototype etc)238 239 FunctionPrototype *funcProto = new FunctionPrototype(&globExec);240 b_FunctionPrototype = funcProto;241 ObjectPrototype *objProto = new ObjectPrototype(&globExec, funcProto);242 b_ObjectPrototype = objProto;243 funcProto->setPrototype(b_ObjectPrototype);244 245 ArrayPrototype *arrayProto = new ArrayPrototype(&globExec, objProto);246 b_ArrayPrototype = arrayProto;247 StringPrototype *stringProto = new StringPrototype(&globExec, objProto);248 b_StringPrototype = stringProto;249 BooleanPrototype *booleanProto = new BooleanPrototype(&globExec, objProto, funcProto);250 b_BooleanPrototype = booleanProto;251 NumberPrototype *numberProto = new NumberPrototype(&globExec, objProto, funcProto);252 b_NumberPrototype = numberProto;253 DatePrototype *dateProto = new DatePrototype(&globExec, objProto);254 b_DatePrototype = dateProto;255 RegExpPrototype *regexpProto = new RegExpPrototype(&globExec, objProto, funcProto);256 b_RegExpPrototype = regexpProto;257 ErrorPrototype *errorProto = new ErrorPrototype(&globExec, objProto, funcProto);258 b_ErrorPrototype = errorProto;259 260 JSObject* o = global;261 while (o->prototype()->isObject())262 o = static_cast<JSObject*>(o->prototype());263 o->setPrototype(b_ObjectPrototype);264 265 // Constructors (Object, Array, etc.)266 b_Object = new ObjectObjectImp(&globExec, objProto, funcProto);267 b_Function = new FunctionObjectImp(&globExec, funcProto);268 b_Array = new ArrayObjectImp(&globExec, funcProto, arrayProto);269 b_String = new StringObjectImp(&globExec, funcProto, stringProto);270 b_Boolean = new BooleanObjectImp(&globExec, funcProto, booleanProto);271 b_Number = new NumberObjectImp(&globExec, funcProto, numberProto);272 b_Date = new DateObjectImp(&globExec, funcProto, dateProto);273 b_RegExp = new RegExpObjectImp(&globExec, funcProto, regexpProto);274 b_Error = new ErrorObjectImp(&globExec, funcProto, errorProto);275 276 // Error object prototypes277 b_evalErrorPrototype = new NativeErrorPrototype(&globExec, errorProto, EvalError, "EvalError", "EvalError");278 b_rangeErrorPrototype = new NativeErrorPrototype(&globExec, errorProto, RangeError, "RangeError", "RangeError");279 b_referenceErrorPrototype = new NativeErrorPrototype(&globExec, errorProto, ReferenceError, "ReferenceError", "ReferenceError");280 b_syntaxErrorPrototype = new NativeErrorPrototype(&globExec, errorProto, SyntaxError, "SyntaxError", "SyntaxError");281 b_typeErrorPrototype = new NativeErrorPrototype(&globExec, errorProto, TypeError, "TypeError", "TypeError");282 b_uriErrorPrototype = new NativeErrorPrototype(&globExec, errorProto, URIError, "URIError", "URIError");283 284 // Error objects285 b_evalError = new NativeErrorImp(&globExec, funcProto, b_evalErrorPrototype);286 b_rangeError = new NativeErrorImp(&globExec, funcProto, b_rangeErrorPrototype);287 b_referenceError = new NativeErrorImp(&globExec, funcProto, b_referenceErrorPrototype);288 b_syntaxError = new NativeErrorImp(&globExec, funcProto, b_syntaxErrorPrototype);289 b_typeError = new NativeErrorImp(&globExec, funcProto, b_typeErrorPrototype);290 b_uriError = new NativeErrorImp(&globExec, funcProto, b_uriErrorPrototype);291 292 // ECMA 15.3.4.1293 funcProto->put(&globExec, constructorPropertyName, b_Function, DontEnum);294 295 global->put(&globExec, "Object", b_Object, DontEnum);296 global->put(&globExec, "Function", b_Function, DontEnum);297 global->put(&globExec, "Array", b_Array, DontEnum);298 global->put(&globExec, "Boolean", b_Boolean, DontEnum);299 global->put(&globExec, "String", b_String, DontEnum);300 global->put(&globExec, "Number", b_Number, DontEnum);301 global->put(&globExec, "Date", b_Date, DontEnum);302 global->put(&globExec, "RegExp", b_RegExp, DontEnum);303 global->put(&globExec, "Error", b_Error, DontEnum);304 // Using Internal for those to have something != 0305 // (see kjs_window). Maybe DontEnum would be ok too ?306 global->put(&globExec, "EvalError",b_evalError, Internal);307 global->put(&globExec, "RangeError",b_rangeError, Internal);308 global->put(&globExec, "ReferenceError",b_referenceError, Internal);309 global->put(&globExec, "SyntaxError",b_syntaxError, Internal);310 global->put(&globExec, "TypeError",b_typeError, Internal);311 global->put(&globExec, "URIError",b_uriError, Internal);312 313 // Set the constructorPropertyName property of all builtin constructors314 objProto->put(&globExec, constructorPropertyName, b_Object, DontEnum | DontDelete | ReadOnly);315 funcProto->put(&globExec, constructorPropertyName, b_Function, DontEnum | DontDelete | ReadOnly);316 arrayProto->put(&globExec, constructorPropertyName, b_Array, DontEnum | DontDelete | ReadOnly);317 booleanProto->put(&globExec, constructorPropertyName, b_Boolean, DontEnum | DontDelete | ReadOnly);318 stringProto->put(&globExec, constructorPropertyName, b_String, DontEnum | DontDelete | ReadOnly);319 numberProto->put(&globExec, constructorPropertyName, b_Number, DontEnum | DontDelete | ReadOnly);320 dateProto->put(&globExec, constructorPropertyName, b_Date, DontEnum | DontDelete | ReadOnly);321 regexpProto->put(&globExec, constructorPropertyName, b_RegExp, DontEnum | DontDelete | ReadOnly);322 errorProto->put(&globExec, constructorPropertyName, b_Error, DontEnum | DontDelete | ReadOnly);323 b_evalErrorPrototype->put(&globExec, constructorPropertyName, b_evalError, DontEnum | DontDelete | ReadOnly);324 b_rangeErrorPrototype->put(&globExec, constructorPropertyName, b_rangeError, DontEnum | DontDelete | ReadOnly);325 b_referenceErrorPrototype->put(&globExec, constructorPropertyName, b_referenceError, DontEnum | DontDelete | ReadOnly);326 b_syntaxErrorPrototype->put(&globExec, constructorPropertyName, b_syntaxError, DontEnum | DontDelete | ReadOnly);327 b_typeErrorPrototype->put(&globExec, constructorPropertyName, b_typeError, DontEnum | DontDelete | ReadOnly);328 b_uriErrorPrototype->put(&globExec, constructorPropertyName, b_uriError, DontEnum | DontDelete | ReadOnly);329 330 // built-in values331 global->put(&globExec, "NaN", jsNaN(), DontEnum|DontDelete);332 global->put(&globExec, "Infinity", jsNumber(Inf), DontEnum|DontDelete);333 global->put(&globExec, "undefined", jsUndefined(), DontEnum|DontDelete);334 335 // built-in functions336 global->putDirectFunction(new GlobalFuncImp(&globExec, funcProto, GlobalFuncImp::Eval, 1, "eval"), DontEnum);337 global->putDirectFunction(new GlobalFuncImp(&globExec, funcProto, GlobalFuncImp::ParseInt, 2, "parseInt"), DontEnum);338 global->putDirectFunction(new GlobalFuncImp(&globExec, funcProto, GlobalFuncImp::ParseFloat, 1, "parseFloat"), DontEnum);339 global->putDirectFunction(new GlobalFuncImp(&globExec, funcProto, GlobalFuncImp::IsNaN, 1, "isNaN"), DontEnum);340 global->putDirectFunction(new GlobalFuncImp(&globExec, funcProto, GlobalFuncImp::IsFinite, 1, "isFinite"), DontEnum);341 global->putDirectFunction(new GlobalFuncImp(&globExec, funcProto, GlobalFuncImp::Escape, 1, "escape"), DontEnum);342 global->putDirectFunction(new GlobalFuncImp(&globExec, funcProto, GlobalFuncImp::UnEscape, 1, "unescape"), DontEnum);343 global->putDirectFunction(new GlobalFuncImp(&globExec, funcProto, GlobalFuncImp::DecodeURI, 1, "decodeURI"), DontEnum);344 global->putDirectFunction(new GlobalFuncImp(&globExec, funcProto, GlobalFuncImp::DecodeURIComponent, 1, "decodeURIComponent"), DontEnum);345 global->putDirectFunction(new GlobalFuncImp(&globExec, funcProto, GlobalFuncImp::EncodeURI, 1, "encodeURI"), DontEnum);346 global->putDirectFunction(new GlobalFuncImp(&globExec, funcProto, GlobalFuncImp::EncodeURIComponent, 1, "encodeURIComponent"), DontEnum);347 #ifndef NDEBUG348 global->putDirectFunction(new GlobalFuncImp(&globExec, funcProto, GlobalFuncImp::KJSPrint, 1, "kjsprint"), DontEnum);349 #endif350 351 // built-in objects352 global->put(&globExec, "Math", new MathObjectImp(&globExec, objProto), DontEnum);353 }354 355 InterpreterImp::~InterpreterImp()356 {357 if (dbg)358 dbg->detach(m_interpreter);359 clear();360 }361 362 void InterpreterImp::clear()363 {364 //fprintf(stderr,"InterpreterImp::clear\n");365 // remove from global chain (see init())366 JSLock lock;367 368 next->prev = prev;369 prev->next = next;370 s_hook = next;371 if (s_hook == this)372 {373 // This was the last interpreter374 s_hook = 0L;375 }376 interpreterMap().remove(global);377 }378 379 void InterpreterImp::mark(bool currentThreadIsMainThread)380 {381 if (m_interpreter)382 m_interpreter->mark(currentThreadIsMainThread);383 if (_context)384 _context->mark();385 if (global)386 global->mark();387 if (globExec.exception())388 globExec.exception()->mark();389 }390 391 bool InterpreterImp::checkSyntax(const UString &code)392 {393 JSLock lock;394 395 // Parser::parse() returns 0 in a syntax error occurs, so we just check for that396 RefPtr<ProgramNode> progNode = Parser::parse(UString(), 0, code.data(), code.size(), 0, 0, 0);397 return progNode;398 }399 400 Completion InterpreterImp::evaluate(const UChar* code, int codeLength, JSValue* thisV, const UString& sourceURL, int startingLineNumber)401 {402 JSLock lock;403 404 // prevent against infinite recursion405 if (recursion >= 20)406 return Completion(Throw, Error::create(&globExec, GeneralError, "Recursion too deep"));407 408 // parse the source code409 int sid;410 int errLine;411 UString errMsg;412 RefPtr<ProgramNode> progNode = Parser::parse(sourceURL, startingLineNumber, code, codeLength, &sid, &errLine, &errMsg);413 414 // notify debugger that source has been parsed415 if (dbg) {416 bool cont = dbg->sourceParsed(&globExec, sid, sourceURL, UString(code, codeLength), errLine);417 if (!cont)418 return Completion(Break);419 }420 421 // no program node means a syntax error occurred422 if (!progNode)423 return Completion(Throw, Error::create(&globExec, SyntaxError, errMsg, errLine, sid, &sourceURL));424 425 globExec.clearException();426 427 recursion++;428 429 JSObject* globalObj = globalObject();430 JSObject* thisObj = globalObj;431 432 // "this" must be an object... use same rules as Function.prototype.apply()433 if (thisV && !thisV->isUndefinedOrNull())434 thisObj = thisV->toObject(&globExec);435 436 Completion res;437 if (globExec.hadException())438 // the thisV->toObject() conversion above might have thrown an exception - if so, propagate it439 res = Completion(Throw, globExec.exception());440 else {441 // execute the code442 Context ctx(globalObj, this, thisObj, progNode.get());443 ExecState newExec(m_interpreter, &ctx);444 progNode->processVarDecls(&newExec);445 res = progNode->execute(&newExec);446 }447 448 recursion--;449 450 return res;451 }452 453 void InterpreterImp::saveBuiltins (SavedBuiltins &builtins) const454 {455 if (!builtins._internal) {456 builtins._internal = new SavedBuiltinsInternal;457 }458 459 builtins._internal->b_Object = b_Object;460 builtins._internal->b_Function = b_Function;461 builtins._internal->b_Array = b_Array;462 builtins._internal->b_Boolean = b_Boolean;463 builtins._internal->b_String = b_String;464 builtins._internal->b_Number = b_Number;465 builtins._internal->b_Date = b_Date;466 builtins._internal->b_RegExp = b_RegExp;467 builtins._internal->b_Error = b_Error;468 469 builtins._internal->b_ObjectPrototype = b_ObjectPrototype;470 builtins._internal->b_FunctionPrototype = b_FunctionPrototype;471 builtins._internal->b_ArrayPrototype = b_ArrayPrototype;472 builtins._internal->b_BooleanPrototype = b_BooleanPrototype;473 builtins._internal->b_StringPrototype = b_StringPrototype;474 builtins._internal->b_NumberPrototype = b_NumberPrototype;475 builtins._internal->b_DatePrototype = b_DatePrototype;476 builtins._internal->b_RegExpPrototype = b_RegExpPrototype;477 builtins._internal->b_ErrorPrototype = b_ErrorPrototype;478 479 builtins._internal->b_evalError = b_evalError;480 builtins._internal->b_rangeError = b_rangeError;481 builtins._internal->b_referenceError = b_referenceError;482 builtins._internal->b_syntaxError = b_syntaxError;483 builtins._internal->b_typeError = b_typeError;484 builtins._internal->b_uriError = b_uriError;485 486 builtins._internal->b_evalErrorPrototype = b_evalErrorPrototype;487 builtins._internal->b_rangeErrorPrototype = b_rangeErrorPrototype;488 builtins._internal->b_referenceErrorPrototype = b_referenceErrorPrototype;489 builtins._internal->b_syntaxErrorPrototype = b_syntaxErrorPrototype;490 builtins._internal->b_typeErrorPrototype = b_typeErrorPrototype;491 builtins._internal->b_uriErrorPrototype = b_uriErrorPrototype;492 }493 494 void InterpreterImp::restoreBuiltins (const SavedBuiltins &builtins)495 {496 if (!builtins._internal) {497 return;498 }499 500 b_Object = builtins._internal->b_Object;501 b_Function = builtins._internal->b_Function;502 b_Array = builtins._internal->b_Array;503 b_Boolean = builtins._internal->b_Boolean;504 b_String = builtins._internal->b_String;505 b_Number = builtins._internal->b_Number;506 b_Date = builtins._internal->b_Date;507 b_RegExp = builtins._internal->b_RegExp;508 b_Error = builtins._internal->b_Error;509 510 b_ObjectPrototype = builtins._internal->b_ObjectPrototype;511 b_FunctionPrototype = builtins._internal->b_FunctionPrototype;512 b_ArrayPrototype = builtins._internal->b_ArrayPrototype;513 b_BooleanPrototype = builtins._internal->b_BooleanPrototype;514 b_StringPrototype = builtins._internal->b_StringPrototype;515 b_NumberPrototype = builtins._internal->b_NumberPrototype;516 b_DatePrototype = builtins._internal->b_DatePrototype;517 b_RegExpPrototype = builtins._internal->b_RegExpPrototype;518 b_ErrorPrototype = builtins._internal->b_ErrorPrototype;519 520 b_evalError = builtins._internal->b_evalError;521 b_rangeError = builtins._internal->b_rangeError;522 b_referenceError = builtins._internal->b_referenceError;523 b_syntaxError = builtins._internal->b_syntaxError;524 b_typeError = builtins._internal->b_typeError;525 b_uriError = builtins._internal->b_uriError;526 527 b_evalErrorPrototype = builtins._internal->b_evalErrorPrototype;528 b_rangeErrorPrototype = builtins._internal->b_rangeErrorPrototype;529 b_referenceErrorPrototype = builtins._internal->b_referenceErrorPrototype;530 b_syntaxErrorPrototype = builtins._internal->b_syntaxErrorPrototype;531 b_typeErrorPrototype = builtins._internal->b_typeErrorPrototype;532 b_uriErrorPrototype = builtins._internal->b_uriErrorPrototype;533 }534 535 InterpreterImp *InterpreterImp::interpreterWithGlobalObject(JSObject *global)536 {537 return interpreterMap().get(global);538 }539 540 541 190 // ------------------------------ InternalFunctionImp -------------------------- 542 191
Note:
See TracChangeset
for help on using the changeset viewer.