Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(290)

Side by Side Diff: src/api.cc

Issue 3585010: API: expose RegExp. (Closed)
Patch Set: Created 10 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2010 the V8 project authors. All rights reserved. 1 // Copyright 2010 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 1973 matching lines...) Expand 10 before | Expand all | Expand 10 after
1984 1984
1985 void v8::Date::CheckCast(v8::Value* that) { 1985 void v8::Date::CheckCast(v8::Value* that) {
1986 if (IsDeadCheck("v8::Date::Cast()")) return; 1986 if (IsDeadCheck("v8::Date::Cast()")) return;
1987 i::Handle<i::Object> obj = Utils::OpenHandle(that); 1987 i::Handle<i::Object> obj = Utils::OpenHandle(that);
1988 ApiCheck(obj->HasSpecificClassOf(i::Heap::Date_symbol()), 1988 ApiCheck(obj->HasSpecificClassOf(i::Heap::Date_symbol()),
1989 "v8::Date::Cast()", 1989 "v8::Date::Cast()",
1990 "Could not convert to date"); 1990 "Could not convert to date");
1991 } 1991 }
1992 1992
1993 1993
1994 void v8::RegExp::CheckCast(v8::Value* that) {
1995 if (IsDeadCheck("v8::RegExp::Cast()")) return;
1996 i::Handle<i::Object> obj = Utils::OpenHandle(that);
1997 ApiCheck(obj->IsJSRegExp(),
1998 "v8::RegExp::Cast()",
1999 "Could not convert to regular expression");
2000 }
2001
2002
1994 bool Value::BooleanValue() const { 2003 bool Value::BooleanValue() const {
1995 if (IsDeadCheck("v8::Value::BooleanValue()")) return false; 2004 if (IsDeadCheck("v8::Value::BooleanValue()")) return false;
1996 LOG_API("BooleanValue"); 2005 LOG_API("BooleanValue");
1997 i::Handle<i::Object> obj = Utils::OpenHandle(this); 2006 i::Handle<i::Object> obj = Utils::OpenHandle(this);
1998 if (obj->IsBoolean()) { 2007 if (obj->IsBoolean()) {
1999 return obj->IsTrue(); 2008 return obj->IsTrue();
2000 } else { 2009 } else {
2001 ENTER_V8; 2010 ENTER_V8;
2002 i::Handle<i::Object> value = i::Execution::ToBoolean(obj); 2011 i::Handle<i::Object> value = i::Execution::ToBoolean(obj);
2003 return value->IsTrue(); 2012 return value->IsTrue();
(...skipping 1701 matching lines...) Expand 10 before | Expand all | Expand 10 after
3705 3714
3706 double v8::Date::NumberValue() const { 3715 double v8::Date::NumberValue() const {
3707 if (IsDeadCheck("v8::Date::NumberValue()")) return 0; 3716 if (IsDeadCheck("v8::Date::NumberValue()")) return 0;
3708 LOG_API("Date::NumberValue"); 3717 LOG_API("Date::NumberValue");
3709 i::Handle<i::Object> obj = Utils::OpenHandle(this); 3718 i::Handle<i::Object> obj = Utils::OpenHandle(this);
3710 i::Handle<i::JSValue> jsvalue = i::Handle<i::JSValue>::cast(obj); 3719 i::Handle<i::JSValue> jsvalue = i::Handle<i::JSValue>::cast(obj);
3711 return jsvalue->value()->Number(); 3720 return jsvalue->value()->Number();
3712 } 3721 }
3713 3722
3714 3723
3724 static i::Handle<i::String> RegExpFlagsToString(RegExp::Flags flags) {
3725 char flags_buf[3];
3726 int num_flags = 0;
3727 if ((flags & RegExp::kGlobal) != 0) flags_buf[num_flags++] = 'g';
3728 if ((flags & RegExp::kMultiline) != 0) flags_buf[num_flags++] = 'm';
3729 if ((flags & RegExp::kIgnoreCase) != 0) flags_buf[num_flags++] = 'i';
3730 ASSERT(num_flags <= static_cast<int>(sizeof(flags_buf)));
antonm 2010/10/04 14:44:55 You might prefer to use ARRAY_SIZE macro here
Vitaly Repeshko 2010/10/04 15:04:42 Done. But it's longer and still requires a cast to
3731 if (num_flags == 0) return i::Factory::empty_string();
antonm 2010/10/04 14:44:55 should we have this special case here? if it's pe
Vitaly Repeshko 2010/10/04 15:04:42 Changed to Factory::LookupSymbol.
3732 return i::Factory::NewStringFromAscii(
3733 i::Vector<const char>(flags_buf, num_flags));
3734 }
3735
3736
3737 Local<v8::RegExp> v8::RegExp::New(Handle<String> pattern,
3738 Flags flags) {
3739 EnsureInitialized("v8::RegExp::New()");
3740 LOG_API("RegExp::New");
3741 ENTER_V8;
3742 EXCEPTION_PREAMBLE();
3743 i::Handle<i::String> flags_string = RegExpFlagsToString(flags);
3744 i::Object** argv[2] = {
3745 i::Handle<i::Object>::cast(Utils::OpenHandle(*pattern)).location(),
3746 i::Handle<i::Object>::cast(flags_string).location()
3747 };
3748 i::Handle<i::Object> obj = i::Execution::New(
Mads Ager (chromium) 2010/10/05 08:55:46 I think this code can be simplified by creating a
3749 i::Handle<i::JSFunction>(i::Top::global_context()->regexp_function()),
3750 2, argv,
3751 &has_pending_exception);
3752 EXCEPTION_BAILOUT_CHECK(Local<v8::RegExp>());
3753 if (!obj->IsJSRegExp()) return Local<v8::RegExp>();
antonm 2010/10/04 14:44:55 could this condition be true?
Vitaly Repeshko 2010/10/04 15:04:42 With the current spec only if there's a bug in reg
3754 return Utils::ToLocal(i::Handle<i::JSRegExp>::cast(obj));
3755 }
3756
3757
3758 Local<v8::String> v8::RegExp::GetSource() const {
3759 if (IsDeadCheck("v8::RegExp::GetSource()")) return Local<v8::String>();
3760 i::Handle<i::JSRegExp> obj = Utils::OpenHandle(this);
3761 return Utils::ToLocal(i::Handle<i::String>(obj->Pattern()));
3762 }
3763
3764
3765 // Assert that the static flags cast in GetFlags is valid.
3766 #define REGEXP_FLAG_ASSERT_EQ(api_flag, internal_flag) \
Mads Ager (chromium) 2010/10/05 08:55:46 Is this really worth the macro. Writing this out w
3767 STATIC_ASSERT(static_cast<int>(v8::RegExp::api_flag) == \
3768 static_cast<int>(i::JSRegExp::internal_flag))
3769 REGEXP_FLAG_ASSERT_EQ(kNone, NONE);
3770 REGEXP_FLAG_ASSERT_EQ(kGlobal, GLOBAL);
3771 REGEXP_FLAG_ASSERT_EQ(kIgnoreCase, IGNORE_CASE);
3772 REGEXP_FLAG_ASSERT_EQ(kMultiline, MULTILINE);
3773 #undef REGEXP_FLAG_ASSERT_EQ
3774
3775 v8::RegExp::Flags v8::RegExp::GetFlags() const {
3776 if (IsDeadCheck("v8::RegExp::GetFlags()")) return v8::RegExp::kNone;
3777 i::Handle<i::JSRegExp> obj = Utils::OpenHandle(this);
3778 return static_cast<RegExp::Flags>(obj->GetFlags().value());
3779 }
3780
3781
3715 Local<v8::Array> v8::Array::New(int length) { 3782 Local<v8::Array> v8::Array::New(int length) {
3716 EnsureInitialized("v8::Array::New()"); 3783 EnsureInitialized("v8::Array::New()");
3717 LOG_API("Array::New"); 3784 LOG_API("Array::New");
3718 ENTER_V8; 3785 ENTER_V8;
3719 i::Handle<i::JSArray> obj = i::Factory::NewJSArray(length); 3786 i::Handle<i::JSArray> obj = i::Factory::NewJSArray(length);
3720 return Utils::ToLocal(obj); 3787 return Utils::ToLocal(obj);
3721 } 3788 }
3722 3789
3723 3790
3724 uint32_t v8::Array::Length() const { 3791 uint32_t v8::Array::Length() const {
(...skipping 1169 matching lines...) Expand 10 before | Expand all | Expand 10 after
4894 4961
4895 4962
4896 char* HandleScopeImplementer::Iterate(ObjectVisitor* v, char* storage) { 4963 char* HandleScopeImplementer::Iterate(ObjectVisitor* v, char* storage) {
4897 HandleScopeImplementer* thread_local = 4964 HandleScopeImplementer* thread_local =
4898 reinterpret_cast<HandleScopeImplementer*>(storage); 4965 reinterpret_cast<HandleScopeImplementer*>(storage);
4899 thread_local->IterateThis(v); 4966 thread_local->IterateThis(v);
4900 return storage + ArchiveSpacePerThread(); 4967 return storage + ArchiveSpacePerThread();
4901 } 4968 }
4902 4969
4903 } } // namespace v8::internal 4970 } } // namespace v8::internal
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698