diff --git a/mozilla/js/js2/icodegenerator.cpp b/mozilla/js/js2/icodegenerator.cpp index 9f3a7a6af6d..4325950af37 100644 --- a/mozilla/js/js2/icodegenerator.cpp +++ b/mozilla/js/js2/icodegenerator.cpp @@ -146,6 +146,14 @@ namespace ICG { return dest; } + Register ICodeGenerator::loadString(String &value) + { + Register dest = getRegister(); + LoadString *instr = new LoadString(dest, &value); + iCode->push_back(instr); + return dest; + } + Register ICodeGenerator::newObject() { Register dest = getRegister(); diff --git a/mozilla/js/js2/icodegenerator.h b/mozilla/js/js2/icodegenerator.h index 97c4ccef73b..9caafbcca44 100644 --- a/mozilla/js/js2/icodegenerator.h +++ b/mozilla/js/js2/icodegenerator.h @@ -196,6 +196,7 @@ namespace ICG { Register compare(ICodeOp op, Register source1, Register source2); Register loadImmediate(double value); + Register loadString(String &value); Register newObject(); Register newArray(); diff --git a/mozilla/js/js2/jstypes.cpp b/mozilla/js/js2/jstypes.cpp index 021486eb1dd..85bf483072f 100644 --- a/mozilla/js/js2/jstypes.cpp +++ b/mozilla/js/js2/jstypes.cpp @@ -72,6 +72,9 @@ Formatter& operator<<(Formatter& f, const JSValue& value) case JSValue::function_tag: printFormat(stdOut, "0x%08X", value.object); break; + case JSValue::string_tag: + f << *value.string; + break; default: f << "undefined"; break; diff --git a/mozilla/js/js2/jstypes.h b/mozilla/js/js2/jstypes.h index c2b7e574f80..67055495e2e 100644 --- a/mozilla/js/js2/jstypes.h +++ b/mozilla/js/js2/jstypes.h @@ -43,6 +43,7 @@ /* forward declare classes from JavaScript::ICG */ namespace JavaScript { + class StringAtom; namespace ICG { class ICodeModule; } /* namespace ICG */ @@ -74,6 +75,7 @@ namespace JSTypes { JSObject* object; JSArray* array; JSFunction *function; + String *string; }; enum { @@ -82,7 +84,7 @@ namespace JSTypes { i32_tag, u32_tag, i64_tag, u64_tag, f32_tag, f64_tag, - object_tag, array_tag, function_tag, + object_tag, array_tag, function_tag, string_tag, undefined_tag } tag; @@ -92,12 +94,14 @@ namespace JSTypes { explicit JSValue(JSObject* object) : object(object), tag(object_tag) {} explicit JSValue(JSArray* array) : array(array), tag(array_tag) {} explicit JSValue(JSFunction* function) : function(function), tag(function_tag) {} + explicit JSValue(String* string) : string(string), tag(string_tag) {} int32& operator=(int32 i32) { return (tag = i32_tag, this->i32 = i32); } float64& operator=(float64 f64) { return (tag = f64_tag, this->f64 = f64); } JSObject*& operator=(JSObject* object) { return (tag = object_tag, this->object = object); } JSArray*& operator=(JSArray* array) { return (tag = array_tag, this->array = array); } JSFunction*& operator=(JSFunction* function) { return (tag = function_tag, this->function = function); } + const String*& operator=(String* string) { return (tag = string_tag, this->string = string); } int operator==(const JSValue& value) const; }; diff --git a/mozilla/js/js2/vmtypes.h b/mozilla/js/js2/vmtypes.h index e04993b9fa7..b07207d12ca 100644 --- a/mozilla/js/js2/vmtypes.h +++ b/mozilla/js/js2/vmtypes.h @@ -70,6 +70,7 @@ namespace VM { JSR, /* target */ LOAD_IMMEDIATE, /* dest, immediate value (double) */ LOAD_NAME, /* dest, name */ + LOAD_STRING, /* dest, immediate value (string) */ MOVE, /* dest, source */ MULTIPLY, /* dest, source1, source2 */ NEGATE, /* dest, source */ @@ -129,6 +130,7 @@ namespace VM { "JSR ", "LOAD_IMMEDIATE", "LOAD_NAME ", + "LOAD_STRING ", "MOVE ", "MULTIPLY ", "NEGATE ", @@ -635,6 +637,22 @@ namespace VM { } }; + class LoadString : public Instruction_2 { + public: + /* dest, immediate value (string) */ + LoadString (Register aOp1, String *aOp2) : + Instruction_2 + (LOAD_STRING, aOp1, aOp2) {}; + virtual Formatter& print(Formatter& f) { + f << opcodeNames[LOAD_STRING] << "\t" << "R" << mOp1 << ", " << "'" << *mOp2 << "'"; + return f; + } + virtual Formatter& printOperands(Formatter& f, const JSValues& registers) { + f << "R" << mOp1 << '=' << registers[mOp1]; + return f; + } + }; + class Move : public Instruction_2 { public: /* dest, source */ diff --git a/mozilla/js2/src/icodegenerator.cpp b/mozilla/js2/src/icodegenerator.cpp index 9f3a7a6af6d..4325950af37 100644 --- a/mozilla/js2/src/icodegenerator.cpp +++ b/mozilla/js2/src/icodegenerator.cpp @@ -146,6 +146,14 @@ namespace ICG { return dest; } + Register ICodeGenerator::loadString(String &value) + { + Register dest = getRegister(); + LoadString *instr = new LoadString(dest, &value); + iCode->push_back(instr); + return dest; + } + Register ICodeGenerator::newObject() { Register dest = getRegister(); diff --git a/mozilla/js2/src/icodegenerator.h b/mozilla/js2/src/icodegenerator.h index 97c4ccef73b..9caafbcca44 100644 --- a/mozilla/js2/src/icodegenerator.h +++ b/mozilla/js2/src/icodegenerator.h @@ -196,6 +196,7 @@ namespace ICG { Register compare(ICodeOp op, Register source1, Register source2); Register loadImmediate(double value); + Register loadString(String &value); Register newObject(); Register newArray(); diff --git a/mozilla/js2/src/jstypes.cpp b/mozilla/js2/src/jstypes.cpp index 021486eb1dd..85bf483072f 100644 --- a/mozilla/js2/src/jstypes.cpp +++ b/mozilla/js2/src/jstypes.cpp @@ -72,6 +72,9 @@ Formatter& operator<<(Formatter& f, const JSValue& value) case JSValue::function_tag: printFormat(stdOut, "0x%08X", value.object); break; + case JSValue::string_tag: + f << *value.string; + break; default: f << "undefined"; break; diff --git a/mozilla/js2/src/jstypes.h b/mozilla/js2/src/jstypes.h index c2b7e574f80..67055495e2e 100644 --- a/mozilla/js2/src/jstypes.h +++ b/mozilla/js2/src/jstypes.h @@ -43,6 +43,7 @@ /* forward declare classes from JavaScript::ICG */ namespace JavaScript { + class StringAtom; namespace ICG { class ICodeModule; } /* namespace ICG */ @@ -74,6 +75,7 @@ namespace JSTypes { JSObject* object; JSArray* array; JSFunction *function; + String *string; }; enum { @@ -82,7 +84,7 @@ namespace JSTypes { i32_tag, u32_tag, i64_tag, u64_tag, f32_tag, f64_tag, - object_tag, array_tag, function_tag, + object_tag, array_tag, function_tag, string_tag, undefined_tag } tag; @@ -92,12 +94,14 @@ namespace JSTypes { explicit JSValue(JSObject* object) : object(object), tag(object_tag) {} explicit JSValue(JSArray* array) : array(array), tag(array_tag) {} explicit JSValue(JSFunction* function) : function(function), tag(function_tag) {} + explicit JSValue(String* string) : string(string), tag(string_tag) {} int32& operator=(int32 i32) { return (tag = i32_tag, this->i32 = i32); } float64& operator=(float64 f64) { return (tag = f64_tag, this->f64 = f64); } JSObject*& operator=(JSObject* object) { return (tag = object_tag, this->object = object); } JSArray*& operator=(JSArray* array) { return (tag = array_tag, this->array = array); } JSFunction*& operator=(JSFunction* function) { return (tag = function_tag, this->function = function); } + const String*& operator=(String* string) { return (tag = string_tag, this->string = string); } int operator==(const JSValue& value) const; }; diff --git a/mozilla/js2/src/vmtypes.h b/mozilla/js2/src/vmtypes.h index e04993b9fa7..b07207d12ca 100644 --- a/mozilla/js2/src/vmtypes.h +++ b/mozilla/js2/src/vmtypes.h @@ -70,6 +70,7 @@ namespace VM { JSR, /* target */ LOAD_IMMEDIATE, /* dest, immediate value (double) */ LOAD_NAME, /* dest, name */ + LOAD_STRING, /* dest, immediate value (string) */ MOVE, /* dest, source */ MULTIPLY, /* dest, source1, source2 */ NEGATE, /* dest, source */ @@ -129,6 +130,7 @@ namespace VM { "JSR ", "LOAD_IMMEDIATE", "LOAD_NAME ", + "LOAD_STRING ", "MOVE ", "MULTIPLY ", "NEGATE ", @@ -635,6 +637,22 @@ namespace VM { } }; + class LoadString : public Instruction_2 { + public: + /* dest, immediate value (string) */ + LoadString (Register aOp1, String *aOp2) : + Instruction_2 + (LOAD_STRING, aOp1, aOp2) {}; + virtual Formatter& print(Formatter& f) { + f << opcodeNames[LOAD_STRING] << "\t" << "R" << mOp1 << ", " << "'" << *mOp2 << "'"; + return f; + } + virtual Formatter& printOperands(Formatter& f, const JSValues& registers) { + f << "R" << mOp1 << '=' << registers[mOp1]; + return f; + } + }; + class Move : public Instruction_2 { public: /* dest, source */