Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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 22982 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 22993 desc = x->GetOwnPropertyDescriptor(v8_str("p1")); | 22993 desc = x->GetOwnPropertyDescriptor(v8_str("p1")); |
| 22994 Local<Function> set = | 22994 Local<Function> set = |
| 22995 Local<Function>::Cast(Local<Object>::Cast(desc)->Get(v8_str("set"))); | 22995 Local<Function>::Cast(Local<Object>::Cast(desc)->Get(v8_str("set"))); |
| 22996 Local<Function> get = | 22996 Local<Function> get = |
| 22997 Local<Function>::Cast(Local<Object>::Cast(desc)->Get(v8_str("get"))); | 22997 Local<Function>::Cast(Local<Object>::Cast(desc)->Get(v8_str("get"))); |
| 22998 CHECK_EQ(v8_num(13), get->Call(x, 0, NULL)); | 22998 CHECK_EQ(v8_num(13), get->Call(x, 0, NULL)); |
| 22999 Handle<Value> args[] = { v8_num(14) }; | 22999 Handle<Value> args[] = { v8_num(14) }; |
| 23000 set->Call(x, 1, args); | 23000 set->Call(x, 1, args); |
| 23001 CHECK_EQ(v8_num(14), get->Call(x, 0, NULL)); | 23001 CHECK_EQ(v8_num(14), get->Call(x, 0, NULL)); |
| 23002 } | 23002 } |
| 23003 | |
| 23004 class TestSourceStream : public v8::ScriptCompiler::ExternalSourceStream { | |
| 23005 public: | |
| 23006 explicit TestSourceStream(const char** chunks) : chunks_(chunks), index_(0) { | |
| 23007 SetEncoding(v8::ScriptCompiler::ExternalSourceStream::ONE_BYTE); | |
| 23008 } | |
| 23009 | |
| 23010 virtual unsigned GetMoreData(const char** src) { | |
| 23011 // Unlike in real use cases, this function will never block. | |
| 23012 if (chunks_[index_] == NULL) { | |
| 23013 return 0; | |
| 23014 } | |
| 23015 // Copy the data, since the caller takes ownership of it. | |
| 23016 unsigned len = strlen(chunks_[index_]); | |
|
Sven Panne
2014/09/01 09:07:46
size_t
marja
2014/09/01 11:58:17
Done.
| |
| 23017 // snprintf will NULL-terminate, so reserve space for the NULL too. However, | |
|
Sven Panne
2014/09/01 09:07:46
Nit: It zero-terminates, not NULL-terminates. :-)
marja
2014/09/01 11:58:17
Done.
| |
| 23018 // the caller is not interested in the NULL; we will return the real length | |
| 23019 // below. | |
| 23020 char* copy = new char[len + 1]; | |
| 23021 snprintf(copy, len + 1, "%s", chunks_[index_]); | |
|
Sven Panne
2014/09/01 09:07:46
Wouldn't memcpy simplify things here and below?
marja
2014/09/01 11:58:17
Yes, but presubmit whines about it :(
jochen (gone - plz use gerrit)
2014/09/01 13:16:32
why not strncpy?
marja
2014/09/01 13:23:25
Argh, this discussion was confused.
So I original
| |
| 23022 *src = copy; | |
| 23023 ++index_; | |
| 23024 return len; | |
| 23025 } | |
| 23026 | |
| 23027 // Helper for constructing a string from chunks (the compilation needs it | |
| 23028 // too). | |
| 23029 static char* FullSourceString(const char** chunks) { | |
| 23030 size_t total_len = 0; | |
| 23031 for (size_t i = 0; chunks[i] != NULL; ++i) { | |
| 23032 total_len += strlen(chunks[i]); | |
| 23033 } | |
| 23034 char* full_string = new char[total_len + 1]; | |
| 23035 size_t offset = 0; | |
| 23036 for (size_t i = 0; chunks[i] != NULL; ++i) { | |
| 23037 size_t len = strlen(chunks[i]); | |
| 23038 snprintf(full_string + offset, len + 1, "%s", chunks[i]); | |
| 23039 offset += len; | |
| 23040 } | |
| 23041 return full_string; | |
| 23042 } | |
| 23043 | |
| 23044 private: | |
| 23045 const char** chunks_; | |
| 23046 unsigned index_; | |
| 23047 }; | |
| 23048 | |
| 23049 | |
| 23050 TEST(StreamingSimpleScript) { | |
| 23051 LocalContext env; | |
| 23052 v8::Isolate* isolate = env->GetIsolate(); | |
| 23053 v8::HandleScope scope(isolate); | |
| 23054 | |
| 23055 // This script is unrealistically small, since no one chunk is enough to fill | |
| 23056 // the backing buffer of Scanner, let alone overflow it. Other tests will | |
| 23057 // cover those cases. | |
| 23058 const char* chunks[] = {"function foo() { ret", "urn 3; } f", "oo(); ", NULL}; | |
| 23059 v8::ScriptCompiler::StreamedSource source(new TestSourceStream(chunks)); | |
| 23060 v8::ScriptCompiler::ScriptStreamingTask* task = | |
| 23061 v8::ScriptCompiler::StartStreamingScript(isolate, &source); | |
| 23062 | |
| 23063 // TestSourceStream::GetMoreData won't block, so it's okay to just run the | |
| 23064 // task here in the main thread. | |
| 23065 task->Run(); | |
| 23066 delete task; | |
| 23067 | |
| 23068 v8::ScriptOrigin origin(v8_str("http://foo.com")); | |
| 23069 char* full_source = TestSourceStream::FullSourceString(chunks); | |
| 23070 v8::Handle<Script> script = v8::ScriptCompiler::Compile( | |
| 23071 isolate, &source, v8_str(full_source), origin); | |
| 23072 CHECK(!script.IsEmpty()); | |
| 23073 v8::Handle<Value> result(script->Run()); | |
| 23074 CHECK_EQ(3, result->Int32Value()); | |
| 23075 delete[] full_source; | |
| 23076 } | |
| OLD | NEW |