24 #ifndef _KJS_INTERPRETER_H_
25 #define _KJS_INTERPRETER_H_
27 #include "ExecState.h"
31 #include <wtf/HashMap.h>
59 friend class TimeoutChecker;
88 JSGlobalObject *globalObject()
const;
89 void initGlobalObject();
113 void setGlobalPackage(Package *p);
122 Package *globalPackage();
134 Completion checkSyntax(
const UString &sourceURL,
int startingLineNumber,
const UChar *code,
int codeLength);
169 static bool normalizeCode(
const UString &codeIn,
UString *codeOut,
170 int *errLine =
nullptr,
UString *errMsg =
nullptr);
180 JSObject *builtinObject()
const;
185 JSObject *builtinFunction()
const;
190 JSObject *builtinArray()
const;
195 JSObject *builtinBoolean()
const;
200 JSObject *builtinString()
const;
205 JSObject *builtinNumber()
const;
210 JSObject *builtinDate()
const;
215 JSObject *builtinRegExp()
const;
220 JSObject *builtinError()
const;
225 JSObject *builtinObjectPrototype()
const;
230 JSObject *builtinFunctionPrototype()
const;
235 JSObject *builtinArrayPrototype()
const;
240 JSObject *builtinBooleanPrototype()
const;
245 JSObject *builtinStringPrototype()
const;
250 JSObject *builtinNumberPrototype()
const;
255 JSObject *builtinDatePrototype()
const;
260 JSObject *builtinRegExpPrototype()
const;
265 JSObject *builtinErrorPrototype()
const;
270 JSObject *builtinEvalError()
const;
271 JSObject *builtinRangeError()
const;
272 JSObject *builtinReferenceError()
const;
273 JSObject *builtinSyntaxError()
const;
274 JSObject *builtinTypeError()
const;
275 JSObject *builtinURIError()
const;
277 JSObject *builtinEvalErrorPrototype()
const;
278 JSObject *builtinRangeErrorPrototype()
const;
279 JSObject *builtinReferenceErrorPrototype()
const;
280 JSObject *builtinSyntaxErrorPrototype()
const;
281 JSObject *builtinTypeErrorPrototype()
const;
282 JSObject *builtinURIErrorPrototype()
const;
284 enum CompatMode { NativeMode, IECompat, NetscapeCompat };
295 CompatMode compatMode()
const
304 static bool collect();
310 virtual void mark(
bool currentThreadIsMainThread);
317 static void markSourceCachedObjects();
330 static bool shouldPrintExceptions();
331 static void setShouldPrintExceptions(
bool);
333 void saveBuiltins(SavedBuiltins &)
const;
334 void restoreBuiltins(
const SavedBuiltins &);
348 virtual void *createLanguageInstanceForValue(
ExecState *,
int language, JSObject *value,
const Bindings::RootObject *origin,
const Bindings::RootObject *current);
356 Interpreter *nextInterpreter()
const
360 Interpreter *prevInterpreter()
const
365 Debugger *debugger()
const
369 void setDebugger(Debugger *d)
374 void setExecState(ExecState *e)
380 ExecState *execState()
382 return m_execState ? m_execState : &m_globalExec;
385 void setTimeoutTime(
unsigned timeoutTime)
387 m_timeoutTime = timeoutTime;
390 void startTimeoutCheck();
391 void stopTimeoutCheck();
394 void restartTimeoutCheck();
396 void pauseTimeoutCheck();
397 void resumeTimeoutCheck();
407 if (--m_refCount <= 0) {
416 unsigned char *stackAlloc(
size_t size)
418 unsigned char *nextPtr = stackPtr + size;
419 if (nextPtr <= stackEnd) {
420 unsigned char *toRet = stackPtr;
424 return extendStack(size);
427 void stackFree(
size_t size)
432 ActivationImp *getRecycledActivation()
434 ActivationImp *out =
nullptr;
435 if (m_numCachedActivations) {
436 m_numCachedActivations--;
437 out = m_cachedActivations[m_numCachedActivations];
442 void recycleActivation(ActivationImp *act);
447 static StringImp *internString(
const UString &literal);
448 static void releaseInternedString(
const UString &literal);
450 typedef WTF::HashMap<UString::Rep *, std::pair<KJS::StringImp *, int> > InternedStringsTable;
452 static void markInternedStringsTable();
455 static void initInternedStringsTable();
457 static InternedStringsTable *s_internedStrings;
460 virtual ~Interpreter();
461 virtual bool shouldInterruptScript()
const
469 bool handleTimeout();
471 void printException(
const Completion &c,
const UString &sourceURL);
478 Interpreter(
const Interpreter &);
485 Interpreter operator=(
const Interpreter &);
489 JSGlobalObject *m_globalObject;
490 GlobalExecState m_globalExec;
494 unsigned char *stackBase;
495 unsigned char *stackPtr;
496 unsigned char *stackEnd;
497 unsigned char *extendStack(
size_t needed);
500 enum {MaxCachedActivations = 32};
502 ActivationImp *m_cachedActivations[MaxCachedActivations];
503 int m_numCachedActivations;
506 static Interpreter *s_hook;
507 Interpreter *
next, *prev;
511 Debugger *m_debugger;
512 ExecState *m_execState;
513 CompatMode m_compatMode;
515 TimeoutChecker *m_timeoutChecker;
518 unsigned m_startTimeoutCheckCount;
519 unsigned m_pauseTimeoutCheckCount;
522 void putNamedConstructor(
const char *name, JSObject *value);
524 ProtectedPtr<JSObject> m_Object;
525 ProtectedPtr<JSObject> m_Function;
526 ProtectedPtr<JSObject> m_Array;
527 ProtectedPtr<JSObject> m_Boolean;
528 ProtectedPtr<JSObject> m_String;
529 ProtectedPtr<JSObject> m_Number;
530 ProtectedPtr<JSObject> m_Date;
531 ProtectedPtr<JSObject> m_RegExp;
532 ProtectedPtr<JSObject> m_Error;
534 ProtectedPtr<JSObject> m_ObjectPrototype;
535 ProtectedPtr<JSObject> m_FunctionPrototype;
536 ProtectedPtr<JSObject> m_ArrayPrototype;
537 ProtectedPtr<JSObject> m_BooleanPrototype;
538 ProtectedPtr<JSObject> m_StringPrototype;
539 ProtectedPtr<JSObject> m_NumberPrototype;
540 ProtectedPtr<JSObject> m_DatePrototype;
541 ProtectedPtr<JSObject> m_RegExpPrototype;
542 ProtectedPtr<JSObject> m_ErrorPrototype;
544 ProtectedPtr<JSObject> m_EvalError;
545 ProtectedPtr<JSObject> m_RangeError;
546 ProtectedPtr<JSObject> m_ReferenceError;
547 ProtectedPtr<JSObject> m_SyntaxError;
548 ProtectedPtr<JSObject> m_TypeError;
549 ProtectedPtr<JSObject> m_UriError;
551 ProtectedPtr<JSObject> m_EvalErrorPrototype;
552 ProtectedPtr<JSObject> m_RangeErrorPrototype;
553 ProtectedPtr<JSObject> m_ReferenceErrorPrototype;
554 ProtectedPtr<JSObject> m_SyntaxErrorPrototype;
555 ProtectedPtr<JSObject> m_TypeErrorPrototype;
556 ProtectedPtr<JSObject> m_UriErrorPrototype;
559 inline bool Interpreter::checkTimeout()
565 return handleTimeout();
579 typedef bool (*CharCategoryFunction)(
int c);
580 static void setIdentStartChecker(CharCategoryFunction f);
581 static void setIdentPartChecker(CharCategoryFunction f);
583 typedef int (*StringConversionFunction)(uint16_t *str,
int strLength,
584 uint16_t *&destIfNeeded);
585 static void setToLowerFunction(StringConversionFunction f);
586 static void setToUpperFunction(StringConversionFunction f);
594 #define KJS_QT_UNICODE_IMPL \
596 static bool qtIdentStart(int c) { if (c & 0xffff0000) return false; QChar::Category cat = QChar((unsigned short)c).category(); return cat == QChar::Letter_Uppercase || cat == QChar::Letter_Lowercase || cat == QChar::Letter_Titlecase || cat == QChar::Letter_Modifier || cat == QChar::Letter_Other || c == '$' || c == '_'; } \
597 static bool qtIdentPart(int c) { if (c & 0xffff0000) return false; QChar::Category cat = QChar((unsigned short)c).category(); return cat == QChar::Letter_Uppercase || cat == QChar::Letter_Lowercase || cat == QChar::Letter_Titlecase || cat == QChar::Letter_Modifier || cat == QChar::Letter_Other || cat == QChar::Mark_NonSpacing || cat == QChar::Mark_SpacingCombining || cat == QChar::Number_DecimalDigit || cat == QChar::Punctuation_Connector || c == '$' || c == '_'; } \
598 static int qtToLower(uint16_t* str, int strLength, uint16_t*& destIfNeeded) { \
600 for (int i = 0; i < strLength; ++i) \
601 str[i] = QChar(str[i]).toLower().unicode(); \
602 return strLength; } \
603 static int qtToUpper(uint16_t* str, int strLength, uint16_t*& destIfNeeded) { \
605 for (int i = 0; i < strLength; ++i) \
606 str[i] = QChar(str[i]).toUpper().unicode(); \
607 return strLength; } \
615 #define KJS_QT_UNICODE_SET \
616 { KJS::UnicodeSupport::setIdentStartChecker(KJS::qtIdentStart); \
617 KJS::UnicodeSupport::setIdentPartChecker(KJS::qtIdentPart); \
618 KJS::UnicodeSupport::setToLowerFunction(KJS::qtToLower); \
619 KJS::UnicodeSupport::setToUpperFunction(KJS::qtToUpper); }
623 #endif // _KJS_INTERPRETER_H_